如何在c#中设置行过滤DataGridView为DataTable
本文关键字:过滤 DataGridView DataTable 设置 | 更新日期: 2023-09-27 18:07:08
我有DataGridview,我过滤了它的一些行,我需要将新数据源保存到一个新的数据表,由于某种原因,我当前的代码不工作,这里我如何尝试转换它。
(LogGridView.DataSource as DataTable).DefaultView.RowFilter = string.Format("Type IN({0}) AND Date >= {1} AND Date <= {2} AND Content {3} '%{4}%'", typeFilter, startDate, endDate, likeQuery,keywordFilter.Text);
this.LogGridView.Sort(this.LogGridView.Columns[0], ListSortDirection.Ascending);
FilteredTable = LogGridView.DataSource as DataTable;
public DataTable FilteredTable
{
get;
set;
}
知道为什么不工作吗
谢谢
您在这里看到的是,在应用过滤器和排序之后,源DataTable
没有变化,尽管DataGridView
按预期显示。这是设计好的。所以要求:
FilteredTable = LogGridView.DataSource as DataTable;
将FilteredTable
设置为与原表相同。
- 创建一个具有相同列的新表
- 使用与
DataGridView
排序相同的过滤器字符串和等效排序字符串从原始表中选择行。 - 对于每个选定的行,克隆条目并将它们作为新行添加到新表中。
- 返回新表。
如下所示:
private DataTable CloneAlteredDataTableSource(DataGridView dgv)
{
DataTable dt = dgv.DataSource as DataTable;
if (dt == null)
{
return null;
}
DataTable clone = new DataTable();
foreach (DataColumn col in dt.Columns)
{
clone.Columns.Add(col.ColumnName, col.DataType);
}
string order = string.Empty;
switch (dgv.SortOrder)
{
case SortOrder.Ascending: order = "ASC"; break;
case SortOrder.Descending: order = "DESC"; break;
}
string sort = dgv.SortedColumn == null ? string.Empty : string.Format("{0} {1}", dgv.SortedColumn.Name, order);
DataRow[] rows = dt.Select(dt.DefaultView.RowFilter, sort);
foreach (DataRow row in rows)
{
object[] items = (object[])row.ItemArray.Clone();
clone.Rows.Add(items);
}
return clone;
}
和用法:
(this.LogGridView.DataSource as DataTable).DefaultView.RowFilter = string.Format("Type IN({0}) AND Date >= {1} AND Date <= {2} AND Content {3} '%{4}%'", typeFilter, startDate, endDate, likeQuery,keywordFilter.Text);
this.LogGridView.Sort(this.LogGridView.Columns[0], ListSortDirection.Ascending);
this.FilteredTable = this.CloneAlteredDataTableSource(this.LogGridView);