Member 11856456 Ответов: 1

Как использовать фильтр строк datagridview для исключения из диапазона целых чисел?


Вот код, который у меня есть сейчас:

Dim startYear As Integer, endYear As Integer
        If CheckBox1.Checked = True Then
            If Integer.TryParse(startyear.Text, startYear) AndAlso Integer.TryParse(endyear.Text, endYear) Then
                datat.DefaultView.RowFilter = "[startofyear] >=  '" & startyear.Text & "' and [endofyear] <= '" & endyear.Text & "'"

            End If
        End If


Это отфильтровывает по годам, показывая результат между обоими годами текстового поля. Тем не менее, я ищу, чтобы сделать функцию исключения, которая будет начинаться в startyear и заканчиваться в endyear, но получает все значения между ними. Например, мой диапазон лет может быть 2000-2005, который я хотел бы исключить из набора данных. Итак, 2000, 2001, 2002, 2003, 2005, и в 2005 году все будут изгнаны.

Что я уже пробовал:

Я попытался использовать не в своем заявлении. например,
datat.DefaultView.RowFilter = "not [startofyear] >=  '" & startyear.Text & "' and [endofyear] <= '" & endyear.Text & "'"


Я тоже пробовал
datat.DefaultView.RowFilter = "[startofyear] <>  '" & startyear.Text & "' and [endofyear] <> '" & endyear.Text & "'"


это, казалось, почти исключало все, поэтому я знаю, что это неправильно, основываясь на данных, отфильтрованных и отображенных в datagridview.

Kornfeld Eliyahu Peter

Он должен работать так же, как SQL, так что вы можете попробовать между ними...
Но если вы хотите включить нижнюю границу, но исключить верхнюю, вы должны использовать эту формулу:
Нижний <= vale < верхний

1 Ответов

Рейтинг:
5

Maciej Los

Цитата:
Я бы хотел исключить их из набора данных. Итак, 2000, 2001, 2002, 2003, 2005, и в 2005 году все будут изгнаны.


Все очень просто... В зависимости от ситуации, вы можете использовать:
datat.DefaultView.RowFilter = String.Format("([startofyear] NOT BETWEEN {0} AND {1}) OR ([endofyear] NOT BETWEEN {0} AND {1})", startyear.Text, endyear.Text)
'or
datat.DefaultView.RowFilter = String.Format("([endofyear] < {0} OR [startofyear] > {1})", startyear.Text, endyear.Text)


Для получения более подробной информации, пожалуйста, смотрите:
DataView.Свойство RowFilter (System.Data)[^]
объект DataColumn.Свойство Выражения (System.Data)[^]

[РЕДАКТИРОВАТЬ]
Чуть не забыл...
Чтобы помочь вам понять перекрытие дат, прочтите это: Библиотека временных периодов для .NET[^]


Member 11856456

Я получаю эту ошибку: "выражение содержит неподдерживаемый оператор 'Between'.'"

Maciej Los

Странный...
Между - Это правильное выражение. Итак, попробуйте второе решение.

Member 11856456

Первый не сработал. однако второе решение сработало отлично. Я немного запутался в том, как это работает. Не могли бы вы объяснить мне, как работает это решение, чтобы я мог манипулировать им, если понадобится. Первоначально я пытался использовать оператор and, чтобы сказать между этим и тем, что исключает эти, но это не сработало. Поэтому мне так интересно, почему это или утверждение работает так, как мне нужно?

Maciej Los

Рад, что могу помочь. Для получения более подробной информации перейдите по ссылке, которую я добавил в конце своего ответа ;)
Овации,
Мацей

Maciej Los

Думать об этом... Проверьте приведенный ниже код, чтобы узнать, почему OR работает нормально и AND оператор этого не делает:

DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("startofyear", typeof(int)));
dt.Columns.Add(new DataColumn("endofyear", typeof(int)));

Random rs = new Random();
Random re = new Random();
dt = Enumerable.Range(0, 100)
	.Select(x=> dt.LoadDataRow(new object[]{rs.Next(1995, 2010), rs.Next(1995, 2010) + re.Next(1, 11)}, false))
	.CopyToDataTable();
	
int[] yearsToExclude = {2000,2005};

var result = dt.AsEnumerable()
	.Select(x=> new
	{
		startofyear	= x.Field<int>("startofyear"),
		endofyear = x.Field<int>("endofyear"),
		And_Operator = x.Field<int>("endofyear") < yearsToExclude[0] &&  x.Field<int>("startofyear") > yearsToExclude[1], 
		Or_Operator = x.Field<int>("endofyear") < yearsToExclude[0] ||  x.Field<int>("startofyear") > yearsToExclude[1]
	})
	.ToList();


Овации,
Мацей