Hier ist ein Test-Framework zu zeigen, was ich tue:eine Checkbox Erzwingen zu einer Datasource gebunden zu aktualisieren, wenn es noch nicht angesehen wurde
- ein neues Projekt
- fügen Sie ein Registersteuer
- auf der Registerkarte 1 setzen auf eine Schaltfläche
- auf 2 Registerkarte ein Kontrollkästchen
- diesen Code für seinen Code einfügen setzen
(verwenden Sie die Standardnamen für Kontrollen)
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");
}
}
Das Problem ist, wenn Sie das Programm und sehen Sie Tab 2 und drücken Sie die Taste auf der Registerkarte 1 das Programm funktioniert wie erwartet, aber wenn Sie auf der Registerkarte drücken Sie die Taste ausführen 1 dann auf Registerkarte 2 das Ereignis für das Kontrollkästchen wird nicht ausgelöst, bis Sie auf Registerkarte 2 schauen.
Der Grund dafür ist die Kontrolle auf Registerkarte 2 ist nicht in der "erstellt" -Zustand, so dass ihre Bindung zu ändern Checkbox von unchecked zu checked passiert erst, nachdem das Steuerelement "Created" wurde.
checkbox1.CreateControl() tut nichts, weil nach MSDN
Create keine Steuergriff erstellen, wenn die Kontrolle Visible-Eigenschaft falsch ist. Sie können entweder rufen Sie die Methode Create oder Zugriff auf die Eigenschaft Handle der Kontrolle des Griffs unabhängig von der Kontrolle der Sichtbarkeit, aber in diesem Fall zu erstellen, werden keine Fenstergriffe für die Kontrolle der Kinder geschaffen.
Ich habe versucht, den Wert des Griffes bekommen (es gibt keinen öffentlichen Create() für CheckBox), aber immer noch das gleiche Ergebnis.
Haben andere Vorschläge als das Programm schnell alle meine Registerkarten blinken, die datengebundene Kontrollkästchen beim ersten Laden haben?
EDIT-- pro Jaxidian Vorschlag habe ich eine neue Klasse
public class newcheckbox : CheckBox
{
public new void CreateHandle()
{
base.CreateHandle();
}
}
Ich nenne Create() direkt nach updating = true
gleichen Ergebnisse wie zuvor.
Was ist also falsch an der Verwendung von CreateHandle, wie die MSDN-Dokumentation dann vorschlägt? – Jaxidian
CreateHandle ist eine geschützte Methode, sie kann nicht aus Code aufgerufen werden, wenn ich keine neue geerbte Klasse erstelle. –
Laut den Dokumenten entspricht das Aufrufen von CreateHandle einfach dem Zugriff auf die Handle-Eigenschaft des Steuerelements. Aber auch das half nicht, da WinForms das Steuerelement immer noch nicht "sieht" und das CheckedChanged-Ereignis auslöst. – Thomas