Tips and Tricks: RowFilter и DataTable
понедельник, 1 февраля 2010,
Александр Краковецкий
Пусть у нас есть DataTable:
DataTable dt = new DataTable("Names"); dt.Columns.Add("Age"); dt.Columns.Add("Name"); dt.Columns.Add("State"); dt.LoadDataRow(new Object[] { "20", "Ken Tucker", "Florida" }, true); dt.LoadDataRow(new Object[] { "21", "Cor Ligthert", "Netherlands" }, true); dt.LoadDataRow(new Object[] { "22", "Terry Burns", "United Kingdom" }, true); dt.LoadDataRow(new Object[] { "23", "Armin Zignler", "Germany" }, true); dt.LoadDataRow(new Object[] { "25", "Herfried K. Wagner", "Austria" }, true); dt.LoadDataRow(new Object[] { "25", "Jay B Harlow", "New York" }, true);
Необходимо оставить только строки, которых Age = 25 (таких строк две). Для этого пишем следующий код:
int was = dt.Rows.Count; dt.DefaultView.RowFilter = @"Age = 25"; int became = dt.Rows.Count; Console.WriteLine("Without DataView - was: {0} became: {1}", was, became);
В результате мы получим:
Without DataView - was: 6 became: 6
Т.е. использование RowFilter не удаляет строки из DataTable.
Правильный вариант - использовать дополнительный DataView:
DataView dv = new DataView(dt); int was = dv.Count; dv.RowFilter = @"Age = 25"; int became = dv.Count; Console.WriteLine("With DataView - was: {0} became: {1}", was, became);
В результате мы получим:
Without DataView - was: 6 became: 2
Для того, чтобы получить обратно DataTable, используем выражение dv.ToTable() (не перепутайте с dv.Table - так как данное выражение вернет исходный DataTable).