2009-07-23 9 views
2

ここに私の問題があります: 私はカスタムオブジェクトの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の更新はあなたがする原因となることがわかりますあなたのエントリを失う。

感謝しています。

+0

アップデート編集中のセルからフォーカスを失ったように、何にもするDataGridViewのcurrentCellプロパティを割り当てる保存する前に - 私が動作しているような回避策に入れているが。 PropertyChangedの呼び出しを削除し、代わりにバックグラウンド更新コードでDataridView.InvalidateColumnを呼び出しています。 それについては幸せではありません。 – user144133

答えて

0

あなたのコードで少し演奏しました。新しい行を追加するとすぐに、新しい "foo"オブジェクトが 'DataGridViewのadd-row機能を介してBindingListに自動的に追加されます。 PropertyChangedEventの起動により 'DataGridView'がリフレッシュされるため、コレクション内のオブジェクトと同じ有効なので、 'c'パラメータは実装したスレッド関数によってインクリメントされ、入力の変更は失われます。

私が示唆するものは、新しいオブジェクトの情報を入力する別のビューまたはフォームを持つことです。次に、OKで、新しいfooオブジェクトをリストに追加します。これは、私が知っているDataGridViewから行を直接追加するという目的を破り、好きな場合は私と議論しますが、あなたは他の場所で検証を行うことができます。 UIコード内のすべての検証と修正チェックをコード化したいですか?あなたは "あなたは数字が必要で、そこにはテキストが必要ではありません"と対処する必要がありますか?残りのDataGridViewは更新中ですか?少しイライラするかもしれません。

また、データを常に変更する場合は、グリッドビューから編集可能にする点がほとんどありません。いくつかのデータソースが絶えず変化しているデータソースへの接続アプローチのパラダイムが必要です。この情報をどのように表示しているかを再考したり、ユーザーにデータを見せたり別の方法で編集させたりできます。

私の5セントはとにかくです。

幸運よければ、数字が狂っているのが面白かったし、あなたの問題を理解しています。

レオBruzzaniti

+0

おそらく、私の質問が十分ではない - 新しい行を追加するときに問題は発生していませんが、既存の行の列aまたはbを変更しているときに問題が発生していない可能性があります。また、C列は編集できません(私のアプリでは)。他の回答がないことから、「この動作は設計による」と仮定し、PropertyChangedイベントは常に現在のデータエントリを失うことになります。良いニュースは、以前のコメントで説明した回避策が機能することです。 – user144133

+0

申し訳ありませんが正しく答えることができません - 私は、この行の中で新たに追加された行を編集して現在の行を編集することは、編集モードですぐに問題を抱えて追加するときと同じことだと思います。フィードバックをお寄せいただきありがとうございます! –

0

それは

関連する問題