我可能会向后看这个问题,但我很好奇。有没有办法根据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;
}
答案 0 :(得分:19)
嗯,你可以做到
DataTable data = (DataTable)(dgvMyMembers.DataSource);
然后使用
data.Columns.Remove(...);
我认为这是最快的方式。这将修改数据源表,如果您不想要它,则需要复制表。另请注意,DataGridView.DataSource
不一定是DataTable
类型。
答案 1 :(得分: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;
}
答案 2 :(得分: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; }
}
答案 3 :(得分:3)
首先将datagridview的数据转换为List,然后将List转换为DataTable
public static DataTable ToDataTable<T>( this List<T> 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<object> objs = new List<object>();
objs.AddRange ( ps.Select ( p => p.GetValue ( l , null ) ) );
dt.Rows.Add ( objs.ToArray ( ) );
} );
return dt;
}