Pregunta

Tuve un problema que se resolvió parcialmente. Para explicarlo rápidamente: tengo una cuadrícula ligada a un objeto complejo que requiere ser serializado. Cuando el objeto se reconstruye desde la serialización, un evento como en la cuadrícula no actualiza la visualización de la tabla. Alguien me dijo que reconstruyera el evento una vez que no se serializara, ¡funciona! Pero el evento que actualiza la cuadrícula no parece dispararse en absoluto.

Tuve que construir un evento a partir de mi objeto complejo que me dijo que algo cambiaba por dentro. De este evento agregué este código:

this.bindingSource1.ResetBindings(false);

El problema es que la cuadrícula se voltea y el usuario no se siente bien (las filas se mueven hacia arriba y hacia abajo y luego se detienen).

¿Cómo puedo restablecer el enlace sin tener este tipo de cambio? ¿Cómo puedo resolver el problema original ? (Esto resolverá automáticamente todo).

Update

Aquí hay un ejemplo que hace exactamente el mismo comportamiento:

Crear una clase:

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

Ahora, cree un formulario con una llamada BindingSource " bindingSource1 " e ir a usar la clase como fuente de datos. Cree una cuadrícula y vincule la cuadrícula a bindingsource1.

En esa forma, use este código en la carga:

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

Puse el proceso de serialización en comentario PORQUE parece que hace el mismo comportamiento extraño sin él ... ahora inicie la aplicación. Cambiar el nombre de un cliente. Ejemplo "p1" para " Nuevo nombre " y haga clic en la celda debajo de la cambiada. Verá el " len " La columna NO cambia. PERO si hace clic en la celda que tiene el len, verá que el número cambia al valor correcto.

¿Alguien tiene una idea de por qué?

¿Fue útil?

Solución

He resuelto este problema agregando en BindingList (por herencia) un método [OnDeserialization] dentro de que agregué código que agrega un evento en OnListChange. De esta manera, cuando 1 propiedad cambia, toda la línea se actualiza.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top