Pregunta

La respuesta a esta pregunta puede resultar ser: "No utilice conjuntos de datos escritos sin utilizar el Navegador de enlace". Sin embargo, tengo curiosidad sobre el comportamiento que estoy viendo.

Entonces, creé un formulario donde cada control fue arrastrado desde el explorador de fuentes de datos. Eliminé el Binding Navigator porque es feo e inapropiado para este formulario en particular. Agregué un ListBox y configuré DataSource en BindingSource.
Tenga en cuenta que ListBox no está vinculado, solo se está llenando desde BindingSource. Por un poco de magia con la que no contaba, moverme en ListBox es navegar por BindingSource y todos los demás controles se actualizan en consecuencia.

Puedo hacer cambios en los controles enlazados y llamar explícitamente EndEdit en BindingSource y luego actualizar DataSource a través del Adaptador de tabla. Funciona muy bien.

Cuando realizo cambios en los controles encuadernados y hago clic en una nueva opción en el ListBox, deseo poder verificar los cambios y solicitar que se guarden o restablezcan si los hay.

Aquí está la parte extraña que no he podido entender.

No importa a qué evento adjunte, DataSet.HasChanges no devuelve verdadero hasta el segundo cambio de ListBox. He buscado e intentado docenas de sugerencias, la mayoría de ellas ridículas, pero algunas que parecían prometedoras. Sin suerte.

Editar: no es el segundo clic lo que es significativo, es cuando vuelves a hacer clic en el elemento original (editado).

¿Fue útil?

Solución

Desde que hice la pregunta, he aprendido un poco más sobre BindingSources, DataSets y TableAdapters.

Esto es lo que funciona:

    private void MyListBox_Click(object sender, EventArgs e)
    {
        this.myBindingSource.EndEdit();
        if (myDataSet.HasChanges())
        {
            if (MessageBox.Show("Save changes?", "Before moving on", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                myTableAdapter.Update(myDataSet.myDataTable);
            }
            else
            {
                myDataSet.RejectChanges();
            }
        }
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top