usar - control bindingsource c#
Cuadro de texto refrescante C#de BindingSource (5)
A falta de todo lo demás, puede reasignar el origen de datos cada vez que reciba un nuevo conjunto de datos, haciendo algo como esto:
bindsrcContract.DataSource = typeof(System.Data.DataSet);
bindsrcContract.DataSource = _ds;
(Además, inicializar DataMember primero y luego DataSource le dará un mejor rendimiento).
Tengo problemas para actualizar los controles de Windows Forms que usan un objeto BindingSource. Tenemos un cliente CAB / MVP / SCSF que (en realidad, "nosotros", ya que se trata de un esfuerzo de equipo) estamos desarrollando para que interactúe con los servicios de WCF que se ejecutan en un servidor remoto. (Este es nuestro primer intento de esto, entonces estamos en un modo de aprendizaje). Una de las llamadas (desde el presentador) al servicio devuelve un conjunto de datos que contiene 3 tablas de datos, llamadas "Contrato", "Préstamo" y "Términos". Cada tabla contiene solo una fila. Cuando el servicio devuelve el conjunto de datos, lo almacenamos en SmartPart / View en una variable miembro de clase, llamando a una función en la vista llamada BindData () y pasando el conjunto de datos a la vista desde la clase del presentador;
private System.Data.DataSet _ds = null;
public void BindData(System.Data.DataSet ds)
{
string sErr = "";
try
{
_ds = ds; // save to private member variable
// more code goes down here
}
}
Estamos intentando vincular cada una de las tres tablas de datos a una variedad de cuadros de texto de formularios de formularios de Windows, recuadros en cascada máscaras e Infragistics Combinaciones desplegables de UltraComboEditor Creamos tres objetos BindingSource, uno para cada DataTable utilizando el IDE VS2008.
private System.Windows.Forms.BindingSource bindsrcContract;
private System.Windows.Forms.BindingSource bindsrcLoan;
private System.Windows.Forms.BindingSource bindsrcTerms;
Estamos vinculando los valores como este
if (bindsrcContract.DataSource == null)
{
bindsrcContract.DataSource = _ds;
bindsrcContract.DataMember = “contract”;
txtContract.DataBindings.Add(new Binding("Text", bindsrcContract, "contract_id", true));
txtLateFeeAmt.DataBindings.Add(new Binding("Text", bindsrcContract, "fee_code", true));
txtPrePayPenalty.DataBindings.Add(new Binding("Text", bindsrcContract, "prepay_penalty", true));
txtLateFeeDays.DataBindings.Add(new Binding("Text", bindsrcContract, "late_days", true));
}
if (bindsrcLoan.DataSource == null)
{
bindsrcLoan.DataSource = _ds;
bindsrcLoan.DataMember = “loan”;
mskRecvDate.DataBindings.Add(new Binding("Text", bindsrcLoan, "receive_date", true));
cmboDocsRcvd.DataBindings.Add(new Binding("Value", bindsrcLoan, "docs", true));
}
Esto funciona cuando hacemos la primera lectura del servicio y recuperamos un conjunto de datos. La información se muestra en los controles del formulario, podemos actualizarlo utilizando el formulario y luego "guardarlo" al pasar los valores modificados al servicio WCF.
Aquí está nuestro problema Si seleccionamos una clave de préstamo diferente y hacemos la misma llamada al servicio y obtenemos un nuevo DataSet, nuevamente con 3 tablas con una fila cada una, los controles (cuadros de texto, cuadros de edición enmascarados, etc.) no se actualizan con la nueva información . Tenga en cuenta que smartPart / View no está cerrado ni nada, pero permanece cargado entre llamadas al servicio. En la segunda llamada, no estamos volviendo a vincular las llamadas, sino simplemente tratando de actualizar los datos del DataSet actualizado.
Hemos intentado todo lo que podemos pensar, pero claramente nos falta algo. Este es nuestro primer intento de usar el control BindingSource. Hemos tratado
bindsrcContract.ResetBindings(false);
y
bindsrcContract.ResetBindings(true);
y
bindsrcContract.RaiseListChangedEvents = true;
y
for (int i = 0; i < bindsrcContract.Count; i++)
{
bindsrcContract.ResetItem(i);
}
Además de restablecer la propiedad DataMember nuevamente.
bindsrcContract.DataMember = ”Contract”;
Hemos visto muchos ejemplos. Muchos ejemplos hacen referencia al BindingNavigator, pero como los DataTables solo tienen una fila, no pensamos que necesitáramos eso. Hay muchos ejemplos de grillas, pero no la usamos aquí. ¿Alguien puede señalar dónde estamos yendo mal o indicarnos los recursos que proporcionarán más información?
Estamos usando VisualStudio 2008, C # y .Net 2.0, cliente XP, servidor W2K3.
Gracias por adelantado
wes
Wes, estoy muy contento de poder ayudarte. Aún recuerdo un problema muy similar al tuyo que me llevó semanas descubrir en la naturaleza ...
En cuanto a sus preguntas, esto es todo lo que sé:
Si configura el DataSource primero, entonces el DataMember, su fuente de datos será escaneada dos veces, ya que al configurar el DataMember posteriormente se cambia el enlace existente (válido). Si lo haces al revés, configurando DataMember primero (con DataSource siendo nulo o mejor, typeof (YourData)), el enlace solo tiene lugar una vez cuando configuras el DataSource.
Creo que puedes aplicar la misma solución aquí. En lugar de simplemente
bindsrcContract.DataSource = _ds;
en tu última línea, debes escribir
bindsrcContract.DataSource = typeof(System.Data.DataSet); bindsrcContract.DataSource = _ds;
Lamento decepcionar, pero aprendí todo lo que sé sobre el enlace de datos de MSDN, así como de prueba y error. Fue bastante doloroso. Con suerte, alguien más puede hacer sonar uno o dos enlaces útiles.
Lo primero: esta publicación necesita un poco de organización. Pease recuerda que las respuestas no se mantienen en orden. El orden está determinado por la votación.
Entonces, si tiene preguntas adicionales, solo modifique su pregunta original (marque con "Editar" para evitar confusiones).
Respuestas de respuesta positiva que te parezcan útiles.
Ah, y dicho sea de paso, utilice el botón de muestra de código (encima de la ventana de edición) cuando incluya muestras de código. Eso le dará un buen formato del código, incluido el resaltado de sintaxis.
Ahora al grano: el problema subyacente en ambas preguntas es que Binding-Manager mantiene los enlaces a los objetos originales.
Cuando asigna _ds como DataSource, el Binding-Manager analiza el DataSet y actúa en consecuencia. Si asigna algún otro DataSet a _ds, el Binding-Manager no tiene manera de saber esto. Todavía tiene la referencia en el DataSet-object original. Por lo tanto, esto explica por qué debe restablecer la propiedad DataSource al nuevo DataSet.
También explica por qué la eliminación y la adición de la tabla no conducen a su resultado esperado. De nuevo, el Administrador de enlace contiene la referencia a la tabla anterior (o la primera fila en esa tabla). La nueva tabla nunca está limitada. También en este caso, la reasignación de _ds no ayuda, porque _ds apunta al mismo objeto DataSet que antes. El Binding-Manager es lo suficientemente inteligente como para darse cuenta de que es el mismo objeto y no tiene acción de rebinding.
O bien debe modificar el contenido de sus objetos vinculados (que activa un Evento PropertyChanged al que se suscribe el Binding-Manager) o debe desencadenar una nueva vinculación asignando un objeto diferente a la propiedad DataSource.
Esta es una descripción simplificada de lo que realmente sucede, pero espero que sea suficiente para explicar y resolver su problema. Lamentablemente, aún no he encontrado una explicación exhaustiva de la vinculación de datos de WinForms en la web (o en otro lugar).
Estaba teniendo un problema similar hoy y encontré que esto funciona.
private void btnCancel_Click(object sender, EventArgs e)
{
this.MyTable.RejectChanges();
this.txtMyBoundTextBox.DataBindings[0].ReadValue();
this.EditState = EditStates.NotEditting;
}
prueba la combinación:
bindingsource.EndEdit() // writting data to underlying source
bindingSource.ResetBindings(false) // force controls to reread data from bindingSource
Úselo cuando escriba algo a los controles.