如何从DataGridView构建DataTable?

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

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

希望有道理。


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

我很困惑,因为我没有尝试修改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; } 

好吧,你可以做到

 DataTable data = (DataTable)(dgvMyMembers.DataSource); 

然后使用

 data.Columns.Remove(...); 

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

我不知道框架提供的任何东西(超出你想要避免的东西)会做你想要的但是(我怀疑你知道)自己创建简单的东西会很容易:

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

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

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

首先将datagridview的数据转换为List,然后将List转换为DataTable

  public static DataTable ToDataTable( this List list) where T : class { Type type = typeof(T); var ps = type.GetProperties ( ); var cols = from p in ps select new DataColumn ( p.Name , p.PropertyType ); DataTable dt = new DataTable(); dt.Columns.AddRange(cols.ToArray()); list.ForEach ( (l) => { List objs = new List(); objs.AddRange ( ps.Select ( p => p.GetValue ( l , null ) ) ); dt.Rows.Add ( objs.ToArray ( ) ); } ); return dt; }