如何在C#中将行过滤的DataGridView设置为DataTable

3

我有一个DataGridview,我筛选了其中的一些行,现在我需要将新的数据源保存到一个新的DataTable中。但是,出于某种原因,我的当前代码无法正常工作,以下是我尝试转换的方式。

(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;
    }

有什么想法,为什么它不起作用?

谢谢

1个回答

2
您在这里看到的是,在应用筛选和排序之后,源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);

1
太棒了!谢谢你。这正是我在寻找的。 - user890332

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接