如何在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;
    }

知道为什么不工作吗

谢谢

如何在c#中设置行过滤DataGridView为DataTable

您在这里看到的是,在应用过滤器和排序之后,源DataTable没有变化,尽管DataGridView按预期显示。这是设计好的。所以要求:

FilteredTable =  LogGridView.DataSource as DataTable;

FilteredTable设置为与原表相同。

相反,我们将创建一个方法:
  1. 创建一个具有相同列的新表
  2. 使用与DataGridView排序相同的过滤器字符串和等效排序字符串从原始表中选择行。
  3. 对于每个选定的行,克隆条目并将它们作为新行添加到新表中。
  4. 返回新表。

如下所示:

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);