Вот тестовая среда, показывающая, что я делаю:
- создать новый проект
- добавить элемент управления с вкладками
- на вкладке 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
CreateControl не создает ручка управления, если управление Видимое свойство ложно. Ты можешь либо вызовите метод CreateHandle, либо доступ к свойству Handle для создания ручка управления независимо от контроля, но в этом case, никаких оконных ручек не создаются для контрольных детей.
Я попытался получить значение Handle (нет public CreateHandle() для CheckBox), но все тот же результат.
Любые предложения, кроме того, что программа быстро мигает всеми моими вкладками, которые имеют флаги привязки к данным при первой загрузке?
РЕДАКТИРОВАНИЕ - за предложение Ясидиан Я создал новый класс
public class newcheckbox : CheckBox
{
public new void CreateHandle()
{
base.CreateHandle();
}
}
Я вызываю CreateHandle() сразу после updating = true
тех же результатов, что и раньше.