DatagridView在后台更新中丢失当前编辑

时间:2009-07-23 23:23:35

标签: datagridview background

这是我的问题: 我有一个DataGridView绑定到自定义对象的BindingList。后台线程不断更新这些对象的值。 udpates正确显示,一切都很好,除了一件事 - 如果您在更新后台更新字段时尝试编辑其他字段,则会丢失输入的值。这是一个演示此行为的代码示例: (对于新表单,删除新的DataGridView:)

    using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        private BindingList<foo> flist;
        private Thread thrd;
        private BindingSource b;
        public Form1()
        {
            InitializeComponent();
            flist = new  BindingList<foo>
                    {
                        new foo(){a =1,b = 1, c=1}, 
                        new foo(){a =1,b = 1, c=1}, 
                        new foo(){a =1,b = 1, c=1}, 
                        new foo(){a =1,b = 1, c=1}
                    };
            b = new BindingSource();
            b.DataSource = flist;
            dataGridView1.DataSource = b;
            thrd = new Thread(new ThreadStart(updPRoc));
            thrd.Start();

        }

        private void upd()
        {
            flist.ToList().ForEach(f=>f.c++);
        }  

        private void updPRoc()
        {
            while (true)
            {
                this.BeginInvoke(new MethodInvoker(upd));
                Thread.Sleep(1000);
            }
        }
    }


    public class foo:INotifyPropertyChanged
    {
       private int _c;
       public  int a { get; set; }
       public int b { get; set; }
       public int c 
       { 
           get {return _c;}
           set
           {
               _c = value;
               if (PropertyChanged!= null)
                   PropertyChanged(this,new PropertyChangedEventArgs("c"));
           }
       }

       #region INotifyPropertyChanged Members

       public event PropertyChangedEventHandler PropertyChanged;

       #endregion
    }
}

因此,您编辑a或b列,您会看到c更新列会导致您丢失参赛作品。

任何想法都赞赏。

2 个答案:

答案 0 :(得分:0)

我玩过你的代码。似乎正在发生的事情是,只要添加新行,就会通过'DataGridView的添加行功能自动将新的“foo”对象添加到BindingList。由于它与集合中的对象一样有效,因此它的'c'参数将由您实现的线程函数递增,并且您的输入更改将丢失,因为PropertyChangedEvent触发将导致'DataGridView'刷新。

我建议您输入不同的视图或表单,输入新对象的信息。然后在OK,将新的foo对象添加到列表中。这样就无法直接从我知道的DataGridView添加行,并且如果你愿意,可以和我争论,但你可以在其他地方进行所有验证。您想要在UI代码中编写所有验证和更正检查的代码吗?您是否希望用户处理“您需要一个号码而不是那里的文字!”其余DataGridView正在更新的消息?可能有点令人沮丧。

此外,如果数据要不断变化,那么从gridview可以编辑数据几乎没有意义。您需要一种连接方法范例到数据源,其中一些是不断变化的......您可能想重新考虑如何显示这些信息,并让用户看到数据并以不同的方式对其进行编辑。

我的5美分。

祝你好运yoni,很高兴看到数字变得疯狂,我理解你的问题。

Leo Bruzzaniti

答案 1 :(得分:0)

在将datagridview的currentCell属性保存为空之前,它会从正在编辑的单元格中失去焦点