簡體   English   中英

如何從 DataGridView 構建 DataTable?

[英]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 executeforeach的下一次迭代中執行。

我很困惑,因為我沒有嘗試修改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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM