Ecco un framework di test per mostrare quello che sto facendo:Forzare una casella di controllo associato a un DataSource per aggiornare quando non è stato visto ancora
- creare un nuovo progetto
- aggiungere un controllo a schede
- sulla scheda 1 mettere un pulsante
- sulla scheda 2 mettere una casella di controllo
- incollare questo codice per il suo codice
(nomi predefiniti di utilizzo per i controlli)
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");
}
}
Il problema è che se si esegue il programma e guardare scheda 2, quindi premere il pulsante sul scheda 1 Il programma funziona come previsto, se si preme il pulsante sulla scheda 1 poi guardate la scheda 2 l'evento per la casella di controllo non sparerà finché non guardate la scheda 2.
Il motivo per questo è il controllo sulla scheda 2 non è nello stato "creato", quindi il suo legame per cambiare il la casella di controllo da deselezionata a selezionata non si verifica fino a quando il controllo non è stato "Creato".
checkbox1.CreateControl() non fa nulla perché secondo MSDN
CreateControl non crea una maniglia controllo, se proprietà Visible del controllo è falsa. È possibile o chiamare il metodo CreateHandle o accesso alla proprietà Handle per creare maniglia del controllo indipendentemente dalla visibilità del controllo , ma in questo caso , senza maniglie delle finestre sono creati per i bambini del controllo.
ho cercato di ottenere il valore di Maniglia (non c'è pubblico CreateHandle() per casella di controllo), ma ancora lo stesso risultato.
Qualche suggerimento diverso dal fatto che il programma flash rapidamente tutte le mie schede con caselle di controllo associate ai dati quando vengono caricate per la prima volta?
EDIT-- per suggerimento di Jaxidian Ho creato una nuova classe
public class newcheckbox : CheckBox
{
public new void CreateHandle()
{
base.CreateHandle();
}
}
chiamo CreateHandle() subito dopo updating = true
stessi risultati di prima.
Quindi cosa c'è di sbagliato nell'usare CreateHandle come suggerisce la documentazione MSDN? – Jaxidian
CreateHandle è un metodo protetto, non può essere chiamato dal codice a meno che non crei una nuova classe ereditata. –
Secondo i documenti, l'equivalente di chiamare CreateHandle è semplicemente accedere alla proprietà Handle sul controllo. Tuttavia, anche fare ciò non è stato di aiuto dato che WinForms continua a non "vedere" il controllo e ad attivare l'evento CheckedChanged. – Thomas