Что вы можете сделать, это расширить 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;
}
}
Там это событие TextChanged, и вы можете подключить много текстовых полей к одному и тому же событию. Чтобы определить, какие из них были вызваны, вы можете передать параметр отправителя в TextBox. – TaW
Вы создали форму со 100 + TextBoxes, и теперь вам слишком ленив, чтобы установить одно событие для каждого из них: P (просто шучу) Нет, серьезно: Это 100+ Boxes Form, создается ли она динамически через код? Затем вы можете установить eventHandler через один и тот же процесс создания. Вероятно, для одного обработчика, как предлагает TaW. – Fildor
@Fildor Я использую Visual Studio для разработки моих форм. –