ここに私がやっていることを示すためのテストフレームワークがあります:
- 新しいプロジェクトを作成する
- タブ付きコントロールを追加する
- タブ1にボタンを置く
- タブ2にチェックボックスを入れます
- このコードをそのコードに貼り付けます
(コントロールにはデフォルト名を使用)
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");
}
}
問題は、プログラムを実行してタブ 2 を見てからタブ 1 のボタンを押すと、プログラムは期待どおりに動作しますが、タブ 1 のボタンを押してからタブ 2 を見ると、チェックボックスのイベントが発生するまで発生しません。タブ 2 を見てください。
この理由は、タブ 2 のコントロールが「作成済み」状態にないためです。そのため、コントロールが「作成済み」になるまでチェックボックスをオフからオンに変更するバインディングは行われません。
MSDNによると、checkbox1.CreateControl()は何もしません
コントロールの Visible プロパティが false の場合、CreateControl はコントロール ハンドルを作成しません。CreateHandle メソッドを呼び出すか、Handle プロパティにアクセスして、コントロールの可視性に関係なくコントロールのハンドルを作成できますが、この場合、コントロールの子に対してウィンドウ ハンドルは作成されません。
私はHandleの値を取得しようとしました(CheckBoxのパブリックCreateHandle()はありません)が、それでも同じ結果です。
プログラムが最初に読み込まれたときに、データにバインドされたチェックボックスを持つすべてのタブをプログラムがすばやくフラッシュする以外の提案はありますか?
EDIT - Jaxidianの提案に従って、新しいクラスを作成しました
public class newcheckbox : CheckBox
{
public new void CreateHandle()
{
base.CreateHandle();
}
}
updating = true
前と同じ結果の直後に CreateHandle() を呼び出します。