Voici mon problème: J'ai un DataGridView lié à une BindingList d'objets personnalisés. Un thread d'arrière-plan met constamment à jour une valeur de ces objets. Les données s'affichent correctement et tout va bien sauf pour une chose - Si vous essayez d'éditer un champ différent pendant que le champ mis à jour en arrière-plan est mis à jour, il perd la valeur entrée. Voici un exemple de code qui illustre ce comportement: (pour une nouvelle forme, déposez un nouveau DataGridView sur :)DatagridView perd l'édition en cours en arrière-plan Mise à jour en arrière-plan
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
}
}
Ainsi, vous modifier la colonne a ou b, vous verrez que la mise à jour la colonne c vous fait perdre votre entrée.
Toutes les pensées ont apprécié.
Mise à jour - j'ai mis dans une solution qui semble fonctionner. J'ai supprimé l'appel à PropertyChanged et j'appelle à la place DataridView.InvalidateColumn dans le code de mise à jour en arrière-plan. Pas heureux à ce sujet cependant. – user144133