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; }
}
}
當我有重入特例時我做了什麼只是把它們關閉:)並且一切運行良好,至少在我的情況下... – Vale 2011-05-06 09:50:43
你在'CellValueChanged'事件中嘗試了這個,應該在那裏工作我推測 – V4Vendetta 2011-05-06 09:51:05