【问题标题】:how to set Row Filtered DataGridView to DataTable in C#如何在 C# 中将 Row Filtered DataGridView 设置为 DataTable
【发布时间】:2015-08-10 17:18:19
【问题描述】:

我有 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;
    }

任何想法为什么它不工作

谢谢

【问题讨论】:

    标签: c# datagridview datatable


    【解决方案1】:

    您在这里看到的是,在应用过滤器和排序之后,来源 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);
    

    【讨论】:

    • 惊人的答案!谢谢你。这正是我想要的。
    猜你喜欢
    • 2013-07-11
    • 2021-01-10
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 2019-07-08
    • 2016-03-31
    • 1970-01-01
    相关资源
    最近更新 更多