2017-02-21 33 views
0

Сегодня у меня возникла проблема в моем развитии.Как включить кнопку, когда одно из моих текстовых полей изменилось на C#?

У меня есть формы Windows, как это:

Windows Form

Мне нужно активировать кнопку «Appliquer», когда содержание одного моего изменения текстового поля. Я знаю, что могу поместить событие KeyPress в каждое текстовое поле и включить эту кнопку. В этом окне это может быть легко сделать, потому что есть только 10 текстовых полей, но у меня есть другое окно с более чем 100 текстовыми полями, и я думаю, что есть лучшее решение.

Я попытался поместить событие Keydown прямо в мою форму окна, но это не сработает. Итак, мой вопрос: как я могу это сделать. Если у кого-то есть идея?

Спасибо заранее!

Томас

+4

Там это событие TextChanged, и вы можете подключить много текстовых полей к одному и тому же событию. Чтобы определить, какие из них были вызваны, вы можете передать параметр отправителя в TextBox. – TaW

+0

Вы создали форму со 100 + TextBoxes, и теперь вам слишком ленив, чтобы установить одно событие для каждого из них: P (просто шучу) Нет, серьезно: Это 100+ Boxes Form, создается ли она динамически через код? Затем вы можете установить eventHandler через один и тот же процесс создания. Вероятно, для одного обработчика, как предлагает TaW. – Fildor

+0

@Fildor Я использую Visual Studio для разработки моих форм. –

ответ

1

Поскольку у вас уже есть 100+ в текстовые поля формы. Я предполагаю, что производительность для вас не проблема.

В вашем конструкторе формы вызовите этот метод. Он будет прикрепить событие для всех элементов управления TextBox, присутствующего в вашей форме & внутри подразделы управления, такие как GroupBox, панель и т.д. (если требуется)

Там может быть более эффективными способами итерации ..

public Form1()//your constructor 
     { 
      InitializeComponent(); 

      AttachEvent(this); 

     } 
    void AttachEvent(Control CTrl) 
      { 
       foreach (Control c in CTrl.Controls) 
       { 
        if (c is TextBox) 
        { 
         c.TextChanged += new EventHandler(c_TextChanged); 
         continue; 
        } 
        if (c.HasChildren) 
        { 
         AttachEvent(c); 
        } 
       } 
      } 

      void c_TextChanged(object sender, EventArgs e) 
      { 
       //Your Code here btnGo.Enabled = !btnGo.Enabled; 
      } 
+0

Он работает! Спасибо ! –

0

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

public class MeTextBox 
    : TextBox 
{ 
    public override string Text 
    { 
     get { return base.Text; } 
     set 
     { 
      if (m_DependantControl != null) 
      { 
       m_DependantControl.Enabled = !string.IsNullOrWhiteSpace(value); 
      } 
      base.Text = value; 
     } 
    } 

    Control m_DependantControl; 

    [Browsable(true)] 
    public Control DependantControl 
    { 
     get { return m_DependantControl; } 
     set { m_DependantControl = value; } 
    } 
} 

Теперь вы можете использовать MeTextBox как обычный TextBox. И если вы хотите, чтобы он контролировал флаг Enabled другого Control, вы можете просто указать DependantControl свойство, которое будет доступно в дизайнере.

Fitting это в вашем примере (код):

// assume you have a Button named btnConfirm 
// and want to enable this button only when your `TextBox` has some text 
MeTextBox mtb = new MeTextBox(); 
mtb.DependantControl = btnConfirm; 

И если вы не хотите, чтобы сделать это в коде, вы можете использовать конструктор напрямую.

Чтобы сделать наоборот (одна кнопка зависит от многих текстовых полей) вы можете расширить Button объект:

public class MeButton 
    : Button 
{ 
    List<TextBox> m_DependantOn = new List<Control>(); 

    [Browsable(true)] 
    public List<TextBox> DependantOn 
    { 
     get { return m_DependantOn; } 
     set { RemoveEvents(); m_DependantOn = value; AssignEvents(); } 
    } 

    void RemoveEvents() 
    { 
     foreach(TextBox ctrl in m_DependantOn) 
      ctrl.TextChanged -= WhenTextChanged; 
    } 

    void AssignEvents() 
    { 
     foreach(TextBox.ctrl in m_DependantOn) 
      ctrl.TextChanged += WhenTextChanged; 
    } 

    void WhenTextChanged(object sender, TextChangedEventArgs e) 
    { 
     this.Enabled = true; 
    } 
}