Aquí está un marco de prueba para mostrar lo que estoy haciendo:Forzar a una casilla de verificación unido a una fuente de datos para actualizar cuando no ha sido visto aún
- crear un nuevo proyecto
- agregar un control de pestañas
- en la ficha 1 poner un botón
- en la pestaña 2 poner una casilla de verificación
- pega este código para su código
(nombres predeterminados de uso de los controles)
public partial class Form1 : Form
{
private List<bool> boolList = new List<bool>();
BindingSource bs = new BindingSource();
public Form1()
{
InitializeComponent();
boolList.Add(false);
bs.DataSource = boolList;
checkBox1.DataBindings.Add("Checked", bs, "");
this.button1.Click += new System.EventHandler(this.button1_Click);
this.checkBox1.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);
}
bool updating = false;
private void button1_Click(object sender, EventArgs e)
{
updating = true;
boolList[0] = true;
bs.ResetBindings(false);
Application.DoEvents();
updating = false;
}
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
if (!updating)
MessageBox.Show("CheckChanged fired outside of updating");
}
}
La cuestión es si se ejecuta el programa y mira pestaña 2 y pulse el botón en la pestaña 1 El programa funciona como se espera, sin embargo, si se pulsa el botón en la pestaña 1 luego observe la pestaña 2 el evento para la casilla de verificación no se disparará hasta que vea la pestaña 2.
La razón para esto es que el control en la pestaña 2 no está en el estado "creado", por lo que su enlace para cambiar la la casilla de verificación desde no marcada a marcada no ocurre hasta que el control haya sido "Creado".
checkbox1.CreateControl() no hace nada porque según MSDN
CreateControl no crea un mango control si la propiedad Visible del control es falsa. Puede o bien llamar al método CreateHandle o acceso a la propiedad de la manija para crear el identificador del control independientemente de la visibilidad del control , pero en este caso , no hay identificadores de ventana son creados para los niños del control.
he intentado conseguir el valor de la manija (no hay pública CreateHandle() para la casilla de verificación), pero sigue siendo el mismo resultado.
¿Alguna otra sugerencia que no sea hacer que el programa muestre rápidamente todas las pestañas que tienen casillas de verificación unidas a datos cuando se cargan por primera vez?
EDIT-- por sugerencia de Jaxidian que creó una nueva clase
public class newcheckbox : CheckBox
{
public new void CreateHandle()
{
base.CreateHandle();
}
}
llamo CreateHandle() justo después de updating = true
mismos resultados que antes.
Entonces, ¿qué pasa con el uso de CreateHandle como la documentación de MSDN sugiere entonces? – Jaxidian
CreateHandle es un método protegido, no se puede invocar desde el código a menos que se crea una nueva clase heredada. –
De acuerdo con los documentos, el equivalente a llamar CreateHandle es simplemente acceder a la propiedad Handle en el control. Sin embargo, incluso hacerlo no ayudó, ya que WinForms todavía no "ve" el control y dispara el evento CheckedChanged. – Thomas