如何从DataGridView构建DataTable?

Ref*_*din 14 .net c# datatable datagridview

我可能会向后看这个问题,但我很好奇.有没有办法DataTable从目前显示的内容中构建一个DataGridView

要清楚,我知道你可以这样做,DataTable data = (DataTable)(dgvMyMembers.DataSource);但包括隐藏的列.我想只从显示的列构建它.

希望有道理.


所以我最终尝试了几个答案的组合,因为这似乎是最好的.以下是我的尝试.基本上我是从DataSource创建DataTable,然后根据列是否可见来向后工作.但是,在删除列后,我会Collection was modified; enumeration operation may not execute在下一次迭代中得到一个foreach.

我很困惑,因为我不想要修改DataGridView,只有DataTable这样这是怎么回事?

DataTable data = GetDataTableFromDGV(dgvMyMembers);


    private DataTable GetDataTableFromDGV(DataGridView dgv)
    {
        var dt = ((DataTable)dgv.DataSource).Copy();
        foreach (DataGridViewColumn column in dgv.Columns)
        {
            if (!column.Visible)
            {
                dt.Columns.Remove(column.Name);
            }
        }
        return dt;
    }
Run Code Online (Sandbox Code Playgroud)

Pet*_*lin 21

好吧,你可以做到

DataTable data = (DataTable)(dgvMyMembers.DataSource);
Run Code Online (Sandbox Code Playgroud)

然后使用

data.Columns.Remove(...);
Run Code Online (Sandbox Code Playgroud)

我认为这是最快的方式.这将修改数据源表,如果您不想要它,则需要复制表.还要注意,DataGridView.DataSource不一定是DataTable类型.

  • 很好的答案!我很欣赏简洁的代码.我也认为你使用Gadget作为你的头像.老派为胜利! (2认同)

Jay*_*ggs 16

我不知道该框架提供的任何东西(除了要避免的),会做你想要什么,但(我怀疑你知道),这将是非常容易创建一些简单的自己:

private DataTable GetDataTableFromDGV(DataGridView dgv) {
    var dt = new DataTable();
    foreach (DataGridViewColumn column in dgv.Columns) {
        if (column.Visible) {
            // You could potentially name the column based on the DGV column name (beware of dupes)
            // or assign a type based on the data type of the data bound to this DGV column.
            dt.Columns.Add();
        }
    }

    object[] cellValues = new object[dgv.Columns.Count];
    foreach (DataGridViewRow row in dgv.Rows) {
        for (int i = 0; i < row.Cells.Count; i++) {
            cellValues[i] = row.Cells[i].Value;
        }
        dt.Rows.Add(cellValues);
    }

    return dt;
}
Run Code Online (Sandbox Code Playgroud)


小智 6

最好的解决方案之一享受它;)

  public DataTable GetContentAsDataTable(bool IgnoreHideColumns=false)
        {
            try
            {
                if (dgv.ColumnCount == 0) return null;
                DataTable dtSource = new DataTable();
                foreach (DataGridViewColumn col in dgv.Columns)
                {
                    if (IgnoreHideColumns & !col.Visible) continue;
                    if (col.Name == string.Empty) continue;
                    dtSource.Columns.Add(col.Name, col.ValueType);
                    dtSource.Columns[col.Name].Caption = col.HeaderText;
                }
                if (dtSource.Columns.Count == 0) return null;
                foreach (DataGridViewRow row in dgv.Rows)
                {
                    DataRow drNewRow = dtSource.NewRow();
                    foreach (DataColumn  col in dtSource .Columns)
                    {
                        drNewRow[col.ColumnName] = row.Cells[col.ColumnName].Value;
                    }
                    dtSource.Rows.Add(drNewRow);
                }
                return dtSource;
            }
            catch { return null; }
        }
Run Code Online (Sandbox Code Playgroud)