繁体   English   中英

单元格编辑后在DataGridView中更改数据源

[英]Changing the datasource in a DataGridView after cell editing

当我尝试更改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事件,它应该可以正常工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM