2

ここに私の問題があります: カスタム オブジェクトの BindingList にバインドされた DataGridView があります。バックグラウンド スレッドは、これらのオブジェクトの値を常に更新しています。更新は正しく表示されており、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
    }
}

したがって、列 a または b を編集すると、列 c の更新によってエントリが失われることがわかります。

どんな考えでも大歓迎です。

4

2 に答える 2

0

私はあなたのコードで少し遊んだ。何が起こっているのかというと、新しい行を追加するとすぐに、新しい「foo」オブジェクトがBindingList「DataGridView」の行追加機能を介して自動的にに追加されるようです。コレクション内のオブジェクトと同じくらい有効であるため、その'c'パラメーターは、実装したスレッド関数によってインクリメントされ、PropertyChangedEventの起動によって' DataGridView'が更新されるため、入力の変更は失われます。

私が提案するのは、新しいオブジェクトの情報を入力する別のビューまたはフォームを使用することです。次に、[OK]で、新しいfooオブジェクトをリストに追加します。これは、DataGridViewから直接行を追加するという目的を無効にします。私はそれを知っており、必要に応じて私と議論しますが、すべての検証を別の場所で行うことができます。UIコード内のすべての検証と修正チェックをコーディングしますか?ユーザーに「テキストではなく番号が必要です」と対処してもらいたいですか。DataGridViewの残りの部分が更新されている間のメッセージ?少しイライラするかもしれません。

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

とにかく私の5セント。

頑張ってよに、数字がおかしくなるのを見るのは楽しかったし、あなたの問題を理解している。

レオ・ブルザニティ

于 2009-08-04T12:15:31.187 に答える
0

保存する前に、編集中のセルからフォーカスを失うように、datagridview の currentCell プロパティを何も割り当てません。

于 2009-11-19T02:48:34.010 に答える