0

部分的に解決された問題がありました。簡単に説明すると、シリアライズが必要な複雑なオブジェクトにバインドされたグリッドがあります。オブジェクトがシリアライゼーションからビルドバックされると、グリッドのようなイベントはテーブル表示を更新しません。シリアル化を解除したら、イベントを再構築するように誰かに言われましたが、うまくいきました! しかし、グリッドを更新するイベントはまったく発生していないようです。

内部で何かが変化したことを知らせる複雑なオブジェクトからイベントを作成する必要がありました。このイベントから、このコードを追加しました:

this.bindingSource1.ResetBindings(false);

問題は、グリッドが反転していて、ユーザーが良い感覚を持っていないことです (行が上下に移動し、停止するよりも)。

この種の反転を行わずにバインドをリセットするにはどうすればよいですか? どうすれば元の問題を解決できますか? (これにより、すべてが自動的に解決されます)。

アップデート

まったく同じ動作をする例を次に示します。

クラスを作成します。

[Serializable()]
class BOClient : INotifyPropertyChanged, IDataErrorInfo
{
    private string name;
    private int len;
    public string Name
    {
        get { return name; }
        set { name = value;
        this.len = name.Length;
        if (this.PropertyChanged !=null)
            this.PropertyChanged(this, new PropertyChangedEventArgs("Name"));
        }
    }

    public int Len
    {
        get { return this.len; }
    }

    public BOClient(string name)
    {
        this.Name = name;
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion

    #region IDataErrorInfo Members

    public string Error
    {
        get { return ""; }
    }

    public string this[string columnName]
    {
        get { return ""; }
    }

    #endregion
}

ここで、BindingSource 呼び出し "bindingSource1" を使用してフォームを作成し、クラスをデータソースとして使用します。グリッドを作成し、グリッドを bindingsource1 にバインドします。

そのフォームでは、ロードで次のコードを使用します。

 private void Form1_Load(object sender, EventArgs e)
    {
        BindingList<BOClient> listClient = new BindingList<BOClient>();
        listClient.Add(new BOClient("P1"));
        listClient.Add(new BOClient("P2"));
        listClient.Add(new BOClient("P3"));

        //using (MemoryStream mem = new MemoryStream())
        //{
        //    BinaryFormatter b1 = new BinaryFormatter();

        //    try
        //    {
        //        b1.Serialize(mem, listClient);
        //    }
        //    catch (Exception ez)
        //    {
        //        MessageBox.Show(ez.Message);
        //    }




        //    BinaryFormatter b2 = new BinaryFormatter();

        //    try
        //    {
        //        mem.Position = 0;
        //        listClient = (BindingList<BOClient>)b2.Deserialize(mem);
        //    }
        //    catch (Exception ez)
        //    {
        //        MessageBox.Show(ez.Message);
        //    }

        //}


        this.bindingSource1.DataSource = listClient;
    }

シリアル化プロセスをコメントに入れました。これがないと同じ奇妙な動作をするように見えるためです...今すぐアプリケーションを起動します。クライアントの名前を変更します。「新しい名前」の例「p1」を選択し、変更したセルの下のセルをクリックします。「len」列が変化していないことがわかります。ただし、len のあるセルをクリックすると、数値が正しい値に変化することがわかります。

誰でも理由がわかりますか?

4

1 に答える 1

0

OnListChange にイベントを追加するコードを追加して、BindingList にメソッド [OnDeserialization] を (継承により) 追加することで、この問題を解決しました。このように、1 つのプロパティが変更されると、行全体が更新されます。

于 2008-10-02T18:10:23.973 に答える