2011-06-09 81 views
8

我很可能會將這個問題向後看,但我很好奇。有沒有辦法根據DataGridView中當前顯示的內容構建DataTable如何從DataGridView構建DataTable?

要清楚,我知道你可以做到這一點DataTable data = (DataTable)(dgvMyMembers.DataSource);但是,其中包括隱藏的列。我只想從顯示的列中構建它。

希望是有道理的。


所以我最終嘗試了幾個答案的組合,因爲這似乎是最好的。以下是我正在嘗試的。基本上我是從DataSource創建DataTable,然後根據列是否可見來反向工作。但是,在刪除列之後,我在foreach的下一次迭代中獲得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; 
    } 
+1

由於DataTable綁定到DGV,因此會出現此錯誤;當您從DT中刪除列時,DGV的綁定列也會被刪除。在刪除列之前創建DT的副本,將您的賦值更改爲'dt'以:var dt =((DataTable)dgv.DataSource).Copy();' – 2011-06-09 20:30:14

+0

這樣做,謝謝 – 2011-06-10 15:25:41

回答

14

好了,你可以做

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

然後用

data.Columns.Remove(...); 

我認爲這是最快的方法。這將修改數據源表,如果你不需要它,那麼需要複製表。另請注意,DataGridView.DataSource不一定是DataTable類型。

+2

好的答案!我很欣賞簡潔的代碼。我也因爲使用小工具作爲你的頭像而給你信用。老派的勝利! – 2011-06-09 17:19:34

+0

我不確定誰給這個勾號。我的解決方案最終成爲這個答案和Jay Riggs答案的平等組合。 – 2011-06-10 15:29:14

13

我不知道該框架提供的任何東西(除了要避免的),會做你想要什麼,但(我懷疑你知道),這將是非常容易創建一些簡單的自己:

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

真棒我卡住了,但你給我最好的答案。 – LuckyS 2015-09-03 11:50:27

2

首先轉換您的datagridview的數據名單,然後再轉換列表以數據表

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

dtSource.Columns.Add(col.Name,col.ValueType);命令如果ValueType == null – 2014-07-06 15:28:21

相關問題