当我尝试更改DataGridView控件的数据源时,请允许任何人指出我正在获得的重入异常的正确方向。下面是我目前无法找到合适解决方案的问题的简要示例。我来自Visual Foxpro背景,这种事情很容易实现。
我部分解决这个问题的唯一方法是运行一个线程来更新数据源,但因为这是异步的,所以更新不太可能发生。另一种方法是使用单独的按钮控件来重新排序数据,但这涉及用户按下它 - 更好的方法是在单元格更新后自动化它。
我理解为什么在编辑其他来源的数据时网格会因更改数据源而感到沮丧。我也知道可以将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 :(得分:0)
尝试将代码移动到DataGridView的CellValueChanged
事件,它应该可以正常工作。