当我的一个文本框在C#中发生更改时,如何启用一个按钮?

当我的一个文本框在C#中发生更改时,如何启用一个按钮?,c#,winforms,events,C#,Winforms,Events,今天我的发展遇到了一个问题 我有这样一个Windows窗体: 当我的一个文本框的内容发生变化时,我需要启用“贴花”按钮。 我知道我可以把按键事件放在每个文本框上,并用它启用我的按钮。在这个窗口中可以很容易做到这一点,因为只有10个文本框,但我有一个有100多个文本框的其他窗口,我认为有一个更好的解决方案 我试图将Keydown事件直接放在我的windows窗体中,但它不起作用。 所以我的问题是,我如何才能做到这一点。如果有人有主意 提前谢谢你 Thomas您可以做的是扩展TextBox创建一个

今天我的发展遇到了一个问题

我有这样一个Windows窗体:

当我的一个文本框的内容发生变化时,我需要启用“贴花”按钮。 我知道我可以把按键事件放在每个文本框上,并用它启用我的按钮。在这个窗口中可以很容易做到这一点,因为只有10个文本框,但我有一个有100多个文本框的其他窗口,我认为有一个更好的解决方案

我试图将Keydown事件直接放在我的windows窗体中,但它不起作用。 所以我的问题是,我如何才能做到这一点。如果有人有主意

提前谢谢你


Thomas

您可以做的是扩展
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
。如果要使其成为某个其他
控件
的control
Enabled
标志,则只需指定可在设计器中访问的
Dependent control
属性即可

将此应用到您的示例(代码)中:

如果您不想在代码中使用它,可以直接使用designer

要使其改变方向(一个按钮取决于多个文本框),您可以扩展
按钮
对象:

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;
    }
}
公共类按钮
:按钮
{
列表m_dependent=新列表();
[可浏览(正确)]
公开名单受养人
{
获取{return m_dependent;}
set{RemoveEvents();m_dependent=value;AssignEvents();}
}
void RemoveEvents()
{
foreach(文本框ctrl,以m_为单位,取决于)
ctrl.TextChanged-=WhenTextChanged;
}
无效事件()
{
foreach(m_依赖中的TextBox.ctrl)
ctrl.TextChanged+=WhenTextChanged;
}
当TextChanged时无效(对象发送者,TextChangedEventArgs e)
{
this.Enabled=true;
}
}

因为表单中已有100多个文本框。我假设性能不是你的问题

在表单构造函数中,调用此方法。它会将事件附加到表单中的所有文本框控件和内部子控件,如groupbox、panel等(如果需要)

可能有更好的迭代方法

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;
            }

有一个TextChanged事件,您可以将多个文本框连接到同一个事件。要辨别是哪个触发了它,你可以将sender参数转换为TextBox。你设置了一个包含100多个TextBox的表单,现在你太懒了,无法为每个TextBox设置一个事件;P(开玩笑)不,说真的:100多个盒子的表单,是通过代码动态创建的吗?然后可以通过相同的创建过程设置eventHandler。正如TaW所建议的,可能只有一个处理程序。@Fildor我正在使用Visual Studio设计表单。不确定是否可以批量设置事件处理程序。您是否尝试过选择两个文本字段(Ctrl+单击)?是否可以访问属性浏览器中的“事件”选项卡并设置处理程序(如果可以)?
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;
            }