gpt4 book ai didi

c# - 单元格编辑后更改 DataGridView 中的数据源

转载 作者:太空宇宙 更新时间:2023-11-03 16:46:10 25 4
gpt4 key购买 nike

当我尝试更改 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; }
}
}

最佳答案

尝试将您的代码移动到 DataGridView 的 CellValueChanged 事件,它应该可以正常工作。

关于c# - 单元格编辑后更改 DataGridView 中的数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5909509/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com