2014-01-09 3 views
1

У меня есть диалоговое окно в моей программе, где пользователь может изменить определенные настройки. Когда форма закрыта, изменения сохраняются в файле настроек приложения.Инициализация элементов управления формы

Каждый раз, когда диалог загружается, настройки восстанавливаются в конструкторе формы. Это создает проблему: событие CheckedChanged (в случае флажка в качестве примера) всегда будет запускаться к моменту завершения формы, без каких-либо действий пользователя!

Я не пробовал это, но я думаю, что одним из способов преодоления этой проблемы было бы вывести начальные статусы элементов управления в конструкторе в разделе «Данные»> «Настройки приложения». Но для этого подхода требуется отдельная настройка для каждого элемента управления - это не практично из-за большого количества элементов управления, являющихся одной проблемой.

Есть ли способ (лучше) предварительно инициализировать элементы управления на форме без запуска события CheckedChange?

ответ

0

Вы можете создать переменную уровня класса с именем IsFormLoading. Установите его в True в начале вашего конструктора, а затем установите его в False в конце, после того, как все элементы управления были инициализированы и настройки были восстановлены.

Каждое из событий на форме, которую вы не хотите запускать, может проверить if (IsFormLoading) и только return;.

+0

Лучше надеяться на то, что межсетевая настройка этой переменной происходит асинхронно. Флаг стал бы бесполезным в противном случае. –

+0

@ M.Babcock Вы правы, но он просто читает из файла и устанавливает значения для элементов управления. Должен быть в безопасности. –

+0

@Grant: Я пробовал ваше решение, оно отлично работает и требует минимальных изменений кода. Пальцы вверх. – PeteD

0

Я предполагаю, что у вас есть подписки на события в InitializeComponent() методе, что-то следующую строку:

private void InitializeComponent() { 
    ... 
    this.checkBox1.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged); 
    ... 
} 

и что вы восстановили настройки форме после того, как метод InitializeComponent() вызывается в конструкторе.

Если да, почему бы не попытаться отложить подписку на события после того, как все элементы управления полностью инициализированы сохраненными настройками. Удалите всю подписку на событие (Event + = Обработчик) от InitializeComponent() и поместите его после восстановления настроек.

class Form1 : Form { 
    public Form1() { 
    InitializeComponent(); // remove event subscriptions from InitializeComponent 
    ApplySettings(); // restore settings 
    AttachEventHandlers(); // subscribe to events here 
    } 
} 
+0

Ваши предположения верны. Это решение, вероятно, наиболее надежное, но это немного лишний для того, что мне нужно. Определенно хороший подход к серьезным проектам. – PeteD

0

Таким образом, основной чрезмерно зрения всплывающие шоу, пользователь проверяет некоторые коробки, закрывает форму, и изменения будут сохранены в порядке?

Первый вопрос: Если вы просто сохраняете текущее состояние элементов управления (отмечено, не проверено и т. Д.), Зачем вообще иметь дело с событием CheckedChange? Почему бы просто не сохранить все значения элементов управления в событии Form.FormClosing? Я имею в виду, что я понимаю, что изменившееся событие вызвано, потому что вы устанавливаете элементы управления значениями в событии загрузки формы, но зачем беспокоиться об измененном событии, если вы ничего не делаете, когда происходит событие изменения?

Если вы действительно хотите использовать событие CheckedChange хотя выполнить некоторые действия, то вы можете использовать счетчик как так (верхней части моей головы код так, может быть немного глючит):

private int _loadCount; 

private void Form1_Load(object sender, System.EventArgs e) 
{ 
    _loadCount = 0; 
    //Code to load values for controls... 
} 


private void CheckBox1_CheckedChanged(Object sender, EventArgs e) 
{ 
    _loadCount++; 
    if(_loadCount > 1) 
    { 
    //Do something here... 
    } 
    else 
    { 
    //Do nothing, return false, etc... 
    } 

} 

В любом случае , AFAIK событие с измененными элементами управления всегда срабатывает независимо от того, как изменилось значение элемента управления (щелчок пользователя, через код и т. Д.).

+0

Да, это сработает. Но я думаю, что это вариация на тему, предложенную ранее Грантом. – PeteD

Смежные вопросы