Frage

Ich hatte ein Problem dass teilweise gelöst wurde. Um zu erklären, es schnell: Ich habe ein Raster zu einem komplexen Objekt binded, die serialisiert werden müssen. Wenn das Objekt von der Serialisierung bauen zurück, Ereignis wie auf dem Gitter nicht aktualisiert die Tabellenanzeige. Jemand hat mir gesagt, das Ereignis neu zu erstellen, sobald unserialize, es funktioniert! Aber das Ereignis, das das Raster zu aktualisieren tut scheint gar nicht zu schießen.

Ich hatte ein Spiel von meinem komplexen Objekt zu bauen, die mir innerlich, dass etwas gesagt ändern. Von diesem Ereignis habe ich diesen Code ein:

this.bindingSource1.ResetBindings(false);

Das Problem ist, das Gitter Spiegeln und der Benutzer nicht über ein gutes Gefühl (Zeilen oben und unten bewegen und als Anschlag).

Wie kann ich die Bindung zurücksetzen, ohne dass diese Art mit dem Flipping? Wie kann ich das ursprüngliche Problem lösen? (Dies löst automatisch alles).

Aktualisieren

Dies ist ein Beispiel, das genau das gleiche Verhalten zu tun:

Erstellen

eine Klasse:

[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
}

Erstellen Sie jetzt ein Formular mit einem Binding Anruf „bindingSource1“ und gehen Sie die Klasse als Datenquelle verwenden. Erstellen Sie ein Raster und binden das Gitter an den bindingsource1.

In dieser Form verwendet diesen Code in der Last:

 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;
    }

Ich habe die Serialisierung in Kommentar, weil es scheint, dass es ohne ihnen das gleiche seltsame Verhalten zu tun ... jetzt die Anwendung starten. Ändern Sie den Namen eines Kunden. Beispiel „P1“ für „Neuen Namen“ und klicken Sie auf die Zelle unter den geänderten ein. Sie werden die „len“ Spalte nicht zu ändern sehen. Aber wenn Sie auf die Zelle klicken, die die Len hat sehen Sie die Nummer auf den richtigen Wert zu ändern.

Jeder habe eine Idee, warum?

War es hilfreich?

Lösung

Ich habe dieses Problem lösen, indem sie in den Binding Zugabe (durch Vererbung) ein Verfahren [OnDeserialization] innerhalb von I-Code hinzugefügt, die Veranstaltung auf dem OnListChange hinzufügen. Auf diese Weise, wenn eine Eigenschaftsänderung, die ganze Zeile wird aktualisiert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top