这是一个测试框架来显示我在做什么:
- 创建一个新项目
- 添加选项卡式控件
- 在标签 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 上的控件未处于“已创建”状态,因此在控件“已创建”之前,不会发生将复选框从未选中更改为已选中的绑定。
checkbox1.CreateControl() 没有做任何事情,因为根据MSDN
如果控件的 Visible 属性为 false,则 CreateControl 不会创建控件句柄。无论控件的可见性如何,都可以调用 CreateHandle 方法或访问 Handle 属性来创建控件的句柄,但在这种情况下,不会为控件的子级创建窗口句柄。
我尝试获取 Handle 的值(CheckBox 没有public CreateHandle()),但结果仍然相同。
除了让程序在第一次加载时快速闪烁我所有具有数据绑定复选框的选项卡之外的任何建议?
编辑——根据 Jaxidian 的建议,我创建了一个新课程
public class newcheckbox : CheckBox
{
public new void CreateHandle()
{
base.CreateHandle();
}
}
updating = true
在与以前相同的结果之后,我立即调用 CreateHandle() 。