2011-05-06 112 views
2

請允許任何人指出我正確的方向,當我嘗試更改DataGridView控件的數據源時收到的重入異常。以下是我目前無法找到合適解決方案的問題的簡要示例。我來自Visual Foxpro背景,這種事情很容易實現。在單元格編輯後更改DataGridView中的數據源

我部分解決這個問題的唯一方法是運行一個線程來更新數據源,但因爲這是異步的,所以更新不會發生。另一種方法是使用單獨的按鈕控件重新排序數據,但這涉及到用戶按下它 - 更好的方法是在單元更新後自動化它。

我明白爲什麼網格在編輯另一個源的數據時更改數據源時感到不安。我也知道DataGridView可以設置爲在列上進行排序,但我想要做的不僅僅是完整版本的排序。

要運行下面的代碼,請將一個DataGridView(將其命名爲dgv1)添加到窗體中。然後,通過點擊另一個單元格或使用箭頭鍵,將發生異常的單元格從9改爲3,然後移出單元格。如果在突出顯示另一個單元格之前按下Enter鍵,則不會發生異常,網格也不會重新排序。

namespace dgv_test 
{ 
public partial class Form1 : Form 
{ 
    private List<dv> grid; 
    public Form1() 
    { 
     InitializeComponent(); 
     // this would be from a database 
     List<dv> data = new List<dv> 
         { 
          new dv{ desc="t1", order=1}, 
          new dv{ desc="t2", order=2}, 
          new dv{ desc="t3", order=9}, 
          new dv{ desc="t4", order=4}, 
          new dv{ desc="t5", order=5}, 
         }; 
     // in memory list 
     grid = 
      (from lu in data 
      orderby lu.order 
      select new dv 
      { 
       desc = lu.desc, 
       order = lu.order 
      }).ToList(); 

     // grid list 
     dgv1.DataSource = 
      (from g in grid 
      orderby g.order 
      select new dv 
      { 
       desc = g.desc, 
       order = g.order 
      }).ToList(); 
     // make description column readonly 
     dgv1.Columns[0].ReadOnly = true; 
    } 
    private void dgv1_CellLeave(object sender, DataGridViewCellEventArgs e) 
    { 
     // only update memory copy if order column changed 
     if (dgv1.CurrentCellAddress.X == 1 && dgv1.IsCurrentCellDirty) 
     { 
      // grid is in memory copy of grid data 
      grid.ElementAt(dgv1.CurrentCellAddress.Y).order = int.Parse(dgv1.CurrentCell.EditedFormattedValue.ToString()); 
      rgrid(); 
     } 
    } 
    // this is the function to update datagridview control 
    private void rgrid() 
    { 
     // query the in memory list from the database 
     var gx = 
      (from g in grid 
      orderby g.order 
      select new dv 
      { 
       desc = g.desc, 
       order = g.order 
      }).ToList(); 
     // set the datagridview control with the newly ordered set 
     dgv1.DataSource = gx.ToList(); 
     // do the same for the in memory list so that both are in alinement 
     grid = gx.ToList(); 
    } 
} 
class dv 
{ 
    public string desc { get; set; } 
    public int order { get; set; } 
} 
} 
+0

當我有重入特例時我做了什麼只是把它們關閉:)並且一切運行良好,至少在我的情況下... – Vale 2011-05-06 09:50:43

+1

你在'CellValueChanged'事件中嘗試了這個,應該在那裏工作我推測 – V4Vendetta 2011-05-06 09:51:05

回答

0

嘗試將您的代碼移動到DataGridView的CellValueChanged事件,它應該工作正常。

相關問題