[英]How to build a DataTable from a DataGridView?
我可能會向后看這個問題,但我仍然很好奇。 有沒有辦法從DataGridView
中當前顯示的內容構建DataTable
?
需要明確的是,我知道你可以這樣做DataTable data = (DataTable)(dgvMyMembers.DataSource);
但是,這包括隱藏列。 我只想從顯示的列中構建它。
希望這是有道理的。
所以我最終嘗試了幾個答案的組合,因為這似乎是最好的。 下面是我正在嘗試的。 基本上我是從數據源創建數據表,然后根據列是否可見向后工作。 但是,在它刪除一列后,我得到一個Collection was modified; enumeration operation may not execute
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;
}
好吧,你可以做
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<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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.