2009-06-03 16 views
6

Este es un problema de .NET con winforms, no asp.net.¿Funciona el enlace de datos en el control invisible?

Tengo un formulario de Windows con varias pestañas. Establezco enlaces de datos de todos los controles cuando se carga el formulario. Pero me he dado cuenta de que los enlaces de datos de los controles en la segunda pestaña no funcionan. Esos enlaces solo funcionan cuando se carga el formulario y cuando selecciono la segunda pestaña. Esto me trae la sospecha: los enlaces de datos funcionan solo cuando los controles vinculados se vuelven visibles.

¿Alguien me puede decir si esto es cierto o no? No es difícil probar esto, pero me gustaría saber algo de confirmación.

Gracias

Respuesta

8

Usted está correcto. Un control vinculado a datos no se actualiza hasta que el control se hace visible.

La única referencia que puedo encontrar para esto en este momento es this MSDN thread.

+0

Wow. Supongo que siempre he buscado los datos a través de la fuente de datos. Realmente no tenía idea de que las vinculaciones solo funcionaban realmente cuando el control era visible. – overslacked

+1

Tuve el mismo problema, vea http://stackoverflow.com/questions/9828153 –

+0

Personalmente, lo considero una característica. – nawfal

0

Esto no es algo que he encontrado directamente. Sin embargo, es posible que tenga un problema con el BindingContext. Sin más detalles es difícil de decir, pero si yo fuera tú, establecería un punto de interrupción y me aseguraré de que todos los controles estén vinculados en el mismo contexto.

4

Su problema tiene que ver con el comportamiento de TabControl. Ver Microsoft bug report. Publiqué una solución para ese problema que subclasifica TabControl e 'Iniatalizes' todas las páginas de pestañas cuando se crea el control o se crea el identificador. A continuación se muestra el código para la solución alternativa.

public partial class TabControl : System.Windows.Forms.TabControl 
{ 
    protected override void OnHandleCreated(EventArgs e_) 
    { 
     base.OnHandleCreated(e_); 
     foreach (System.Windows.Forms.TabPage tabPage in TabPages) 
     { 
      InitializeTabPage(tabPage, true, Created); 
     } 
    } 

    protected override void OnControlAdded(ControlEventArgs e_) 
    { 
     base.OnControlAdded(e_); 
     System.Windows.Forms.TabPage page = e_.Control as System.Windows.Forms.TabPage; 
     if ((page != null) && (page.Parent == this) && (IsHandleCreated || Created)) 
     { 
      InitializeTabPage(page, IsHandleCreated, Created); 
     } 
    } 

    protected override void OnCreateControl() 
    { 
     base.OnCreateControl(); 
     foreach (System.Windows.Forms.TabPage tabPage in TabPages) 
     { 
      InitializeTabPage(tabPage, IsHandleCreated, true); 
     } 
    } 

    //PRB: Exception thrown during Windows Forms data binding if bound control is on a tab page with uncreated handle 
    //FIX: Make sure all tab pages are created when the tabcontrol is created. 
    //https://connect.microsoft.com/VisualStudio/feedback/details/351177 
    private void InitializeTabPage(System.Windows.Forms.TabPage page_, bool createHandle_, bool createControl_) 
    { 
     if (!createControl_ && !createHandle_) 
     { 
      return; 
     } 
     if (createHandle_ && !page_.IsHandleCreated) 
     { 
      IntPtr handle = page_.Handle; 
     } 
     if (!page_.Created && createControl_) 
     { 
      return; 
     } 
     bool visible = page_.Visible; 
     if (!visible) 
     { 
      page_.Visible = true; 
     } 
     page_.CreateControl(); 
     if (!visible) 
     { 
      page_.Visible = false; 
     } 
    } 
} 
+0

¿Qué está haciendo exactamente "IntPtr handle = page_.Handle" allí, teniendo en cuenta que el valor no se utiliza? – Michael

+0

Obliga a que se cree el asa –

+0

Gracias. Pensé que era algo por el estilo.Probé esto, por cierto, pero no funcionó para mí. Mis controles se estaban agregando mientras que IsHandleCreated y Created seguían siendo falsos. Imagino que algunos ajustes cubrirían ese caso, pero tomé una ruta diferente: después de hacer todos los enlaces, encuentro todos los controles vinculados y agrego un manejador VisibleChanged a los invisibles, que harán lo que necesito cuando se vuelvan visibles. – Michael

0

Hemos encontrado un problema similar. Estamos intentando escribir en 2 campos enlazados e invisibles para que podamos cambiar el formato que escribimos en nuestro conjunto de datos. Esto funciona bien cuando los objetos están visibles, pero deja de funcionar cuando la propiedad visible se cambió a falso.

para desplazarse por ella, he añadido el siguiente código:

  // Stop our screen flickering. 
     chSplitContainer.Panel2.SuspendLayout(); 
     // Make the bound fields visible or the binding doesn't work. 
     tbxValueCr.Visible = true; 
     tbxValueDb.Visible = true; 

     // Update the fields here. 
     <DO STUFF> 

     // Restore settings to how they were, so you don't know we're here. 
     tbxValueCr.Visible = false; 
     tbxValueDb.Visible = false; 
     chSplitContainer.Panel2.ResumeLayout(); 
1

He luchado con esto mismo y la conclusión de que la única solución, además de subclases parecer (véase la respuesta de hjb417), era hacer que la otra pestaña visible. Cambiar a la otra pestaña y volver al anterior inmediatamente antes de que el formulario esté visible no funciona. Si no quiere tener la segunda pestaña visible, he utilizado el siguiente código como una solución:

this.tabControl.SelectedTab = this.tabPageB; 
this.tabPageB.BindingContextChanged += (object sender, EventArgs e) => { 
    this.tabContainerMain.SelectedTab = this.tabPageA; 
}; 

Suponiendo tabPageA es la pestaña visible, y tabPageB es el invisible desea inicializar. Esto cambia a la página B y regresa una vez que se completa el enlace de datos. Esto es invisible para el usuario en el formulario.

Sigue siendo un hack feo, pero al menos esto funciona. Por supuesto, el código se pone aún más feo cuando tienes varias pestañas.

Cuestiones relacionadas