example español databindings databinding data c# winforms events data-binding binding

español - databindings c# textbox



WinForms: responda a la aplicación de BindingSource (2)

¿Hay algún evento en el que pueda pegarme para recibir una notificación cuando la fuente de datos se haya aplicado a sus controles vinculados?

¿O hay otro evento en el que se me garantiza que se ha aplicado la fuente de datos?

Estoy trabajando con WinForms (proveniente de WPF) y estoy usando etiquetas con valores enlazados a datos para determinar el tipo de control con el que estoy trabajando. Muchos controles podrían tener el mismo valor de etiqueta, y debo recuperar los controles con la etiqueta deseada para poder realizar la lógica comercial.

El problema es que no sé cuándo realizar mi búsqueda de los valores de las etiquetas. Intenté buscar los valores de las etiquetas inmediatamente después de llamar:

myBindingSource.DataSource = OutputFunctions.Instance; //Yes... I''m binding to a singleton with a list of properties. //Its not the best method, but works.

dentro de mi controlador de eventos Form.Load . Pero, durante la búsqueda, he visto que los valores de las etiquetas no están establecidos. ¿Cómo puede ser esto si acabo de configurar la fuente de datos?

Como se puede ver desde el código subyacente administrado internamente para mi formulario, he establecido correctamente el valor a través de la ventana Propiedad del diseñador:

this.textBoxDTemp.DataBindings.Add(new System.Windows.Forms.Binding( "Tag", this.myBindingSource, "KNOB_DRIVER_TEMP", true));

He echado un vistazo al BindingComplete , que honestamente parece muy prometedor, excepto que no se dispara durante la inicialización de la vinculación, a pesar de que el valor supuestamente se está propagando desde la fuente de datos al control objetivo.

EDITAR: por solicitud, la fuente de datos se establece primero en el código subyacente interno para el formulario como tal:

this.myBindingSource.DataSource = typeof(OutputFunctions);

Y aquí está el singleton en caso de que ayude.

public class OutputFunctions { private static OutputFunctions instance; public static OutputFunctions Instance { get { if (instance == null) { instance = new OutputFunctions(); } return instance; } } private OutputFunctions() { } public string KNOB_DRIVER_TEMP { get { return "KNOB_DRIVER_TEMP"; } } public string KNOB_PASSENGER_TEMP { get { return "KNOB_PASSENGER_TEMP"; } } public string KNOB_FAN { get { return "KNOB_FAN"; } } }


Creo que estás buscando el control

Evento "BindingContextChanged".

¿Estás tratando de forzar agregar un gancho a la encuadernación cuando ocurre ?.

Ya que está buscando DESPUÉS de que se haya preparado todo el formulario y se hayan establecido los enlaces, probablemente pueda enganchar al evento "LOAD". El formulario prepara todo primero, luego llamará al evento "Cargar". Si hay algo suscrito (escuchando), se les notificará. Una vez que se invoca, puede ejecutar y recorrer todos los controles del formulario y buscar el tipo de parte / componente / etiqueta / control, etc.

public Form1() { InitializeComponent(); this.VisibleChanged += Form1_VisibleChanged; } void Form1_VisibleChanged(object sender, EventArgs e) { if (!this.Visible) return; // Disable the event hook, we only need it once. this.VisibleChanged -= Form1_VisibleChanged; StringBuilder sb = new StringBuilder(); foreach (Control c in this.Controls) sb.AppendLine(c.Name); }

Editar por comentario. Cambié del evento LOAD al evento VISIBILITY. En este punto, el formulario ahora se muestra, por lo que todas sus cosas DEBERÍAN completarse y estar disponibles. Por lo tanto, la verificación inicial es para asegurarse de que se está haciendo visible. Si es así, elimínelo inmediatamente del controlador de eventos, solo necesita hacerlo una vez y no todo el tiempo posible se muestra / oculta / se muestra ...


El enlace de datos ya debería haberse activado antes del evento de carga de formulario. El problema que está experimentando se debe a que debido a la optimización de la infraestructura de enlace de datos, no se produce el enlace de los controles invisibles hasta que se vuelven visibles por primera vez. Probablemente esto se deba a que los diseñadores de WF pensaban que el enlace de datos se usaría para enlazar solo propiedades de datos (como Text etc.) y no tiene sentido hacer eso para controles invisibles.

Si no tienes miedo de usar algunos internos (o como el usuario HighCore dirá los hacks), el siguiente ayudante te ayudaría a resolver tu problema (estamos usando algo similar durante años):

public static class ControlUtils { static readonly Action<Control, bool> CreateControlFunc = (Action<Control, bool>)Delegate.CreateDelegate(typeof(Action<Control, bool>), typeof(Control).GetMethod("CreateControl", BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { typeof(bool) }, null)); public static void CreateControls(this Control target) { if (!target.Created) CreateControlFunc(target, true); else for (int i = 0; i < target.Controls.Count; i++) target.Controls[i].CreateControls(); } }

y simplemente ponga al comienzo de su formulario controlador de eventos de carga

this.CreateControls();