ここに私の問題があります: 私はカスタムオブジェクトのBindingListにバインドされたDataGridViewを持っています。バックグラウンドスレッドは、これらのオブジェクトの値を常に更新しています。 udpatesは正しく表示されていますが、1つのことを除いてすべて正常です - バックグラウンド更新フィールドが更新されている間に別のフィールドを編集しようとすると、入力された値が失われます。ここでは、この動作を示すコードサンプルは次のとおりです。 (新しいフォームのために、そう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
}
}
:)に新しいDataGridViewのをドロップする、あなたは、列AまたはBを編集し、あなたが列cの更新はあなたがする原因となることがわかりますあなたのエントリを失う。
感謝しています。
アップデート編集中のセルからフォーカスを失ったように、何にもするDataGridViewのcurrentCellプロパティを割り当てる保存する前に - 私が動作しているような回避策に入れているが。 PropertyChangedの呼び出しを削除し、代わりにバックグラウンド更新コードでDataridView.InvalidateColumnを呼び出しています。 それについては幸せではありません。 – user144133