2010-01-18 4 views
8

У меня есть форма, в которой находится tabcontrol. В каждом из этих вкладок имеется множество элементов управления, начиная от текстового поля, выпадающего списка, treecontrol, спиновых элементов управления.отслеживать изменения в winform C#

В верхней части формы есть текстовое поле.

если какие-либо изменения сделаны с помощью элементов управления форм, то говорят, что значение изменено в выпадающем списке вкладки 1 или элемент был удален из элемента управления дерева. Мне нужно показать «*», указав, что определенные значения были изменилось.

Как я могу эффективно это сделать? или обрабатывает соответственно. управляет измененным событием единственным способом узнать, изменен ли элемент или нет?

+0

Это может помочь узнать немного больше о том, как использовать информацию, которая там произошла смена «государства» на данном TabPage: если произошло изменение параметра управления/свойство, вы делаете что-то прежде чем пользователь сможет перейти на другую вкладку? Как сериализовать элементы управления, каким-то образом сохраняя данные свойств? Ответ на ответ TommieB дает вам ниже, что статья CodeProject очень хорошая, потому что в статье проиллюстрированы три различные стратегии мониторинга изменения состояния. – BillW

ответ

4

Я думаю, что эта статья на Codeproject может вам помочь, она помогает отслеживать изменения в элементах winforms.

Надеюсь, это поможет.

+0

Хорошая статья !!!!! – gbianchi

1

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

Если, с другой стороны, программное обеспечение было хорошо спроектировано, тогда у вас будут объекты, находящиеся за интерфейсом пользователя, которые отслеживают состояние пользовательского интерфейса. Эти объекты могут реализовать что-то вроде INotifyPropertyChanged, и вы можете использовать это с механизмом сопоставления для обновления пользовательского интерфейса для измененных полей.

Я подозреваю, что вы попали в первую ситуацию, хотя любые хорошие ответы на вашу проблему были устранены задолго до того, что вы пытаетесь сделать сейчас. Я вывел это из вашего утверждения, что форма «размещает tabcontrol» и что «на каждой из этих вкладок имеется [sic] множество элементов управления ...» Это антипаттерн UI, который я видел снова и снова от бедных дизайнеры.

+0

Почему вы описываете элемент управления вкладкой, содержащий несколько других элементов управления, как антипаттерн? Разумно, как бы вы реорганизовали это? –

+1

@Neil: UserControl (s). Я видел огромное количество ужасного программного обеспечения, которое нажимает (буквально) десятки элементов управления непосредственно на вкладках, в основном делая «Form1» (его почти неизбежно называют «Form1») одним глобальным контейнером для любого состояния без какого-либо чувства абстракции. Члены в Form1 используются как глобальное состояние (частота даже с префиксом 'glb'). Я могу думать о одном конкретном программном обеспечении, которое моя компания продает за> $ 10k/license, которая злоупотребляет частичными классами, чтобы распространять Form1 на 11 файлов с элементами управления, такими как 'textBox74'. Да, существует более 74 текстовых полей. –

+1

Тот, с которым я работал, назывался 'frmMain'. Однако они оставили «Form1» в проекте, а единственной целью «Form1» было отобразить «frmMain», а затем закрыть сам. –

1

Вы можете попробовать что-то в этом направлении, вам нужно добавить немного для каждого типа элемента управления в вашей форме. В событии load from addUpdateNotification (this);

public void addUpdateNotification(Control start) 
    { 
     foreach (Control c in start.Controls) 
     { 
      if (c is TextBox) 
      { 
       var text = c as TextBox; 
       text.TextChanged += notifyChanged; 
      } 

      addUpdateNotification(c); 
     } 
    } 

    public void notifyChanged(Object sender, EventArgs args) 
    { 
     UpdateTextBox.Text = "*"; 
    } 
+1

@BillW вы уверены? Он проходит через всех детей каждого элемента управления, начиная с пускового контроля. Бесконечная рекурсия произошла бы только в том случае, если у дочернего элемента был один из его родителей в качестве ребенка, и код в этой статье выглядит так, будто он задушит ту же ситуацию (что я даже не уверен, возможна ли такая ситуация). – BarrettJ

+0

@ Tester101 исправлен, должен был использоваться на следующей строке вместо c.TextChanged – BarrettJ

+0

@BarretJ Мои извинения, ваш код не создает рекурсии: я нарушил свою собственную политику, не комментируя код, который я лично не тестировал: это научит меня ! – BillW

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