WinForms -包含面板是否捕获了更改子控件的事件?

zzzyeukh  于 2023-02-24  发布在  其他
关注(0)|答案(5)|浏览(113)

我有一个面板,其中有几个文本框,我想通过文本框的值来决定是否启用按钮(也在面板内)。
面板是否注册了一个预定义的事件来捕获内部文本框onTextChange事件?
谢了,舒琪

t3irkdon

t3irkdon1#

我只需要设置一个通用的TextBox_TextChanged事件处理程序来调用我的Validate方法,然后将每个TextBox链接到它,这可以通过一个循环来完成。
可能类似于(未测试):

foreach (Control ctrl in container.Controls)
 {
   if (ctrl is TextBox)
   {
     ((TextBox)ctrl).TextChanged += new System.EventHandler(TextBox_TextChanged);
   }
 }
zed5wv10

zed5wv102#

不幸的是,你必须自己做(订阅文本框上的事件)。

jqjz2hbq

jqjz2hbq3#

不,没有(AFAIK)。但是你可以让你所有的文本框在事件发生时调用同一个方法。如果你想动态添加文本框,你可以注册ControlAdded事件,然后在那里注册新添加的文本框。

yhqotfr8

yhqotfr84#

与HTML DOM不同,WinForms中的事件不会传播到包含元素,因此您必须自己侦听所有事件。

pdtvr36n

pdtvr36n5#

某些Windows控件在其值被修改时向其父控件发送EN_CHANGE消息。
通过重写父WndProc方法,可以检测子控件(文本框或组合框)何时更改。例如:

protected override void WndProc(ref Message m)
    {
        if (m.Msg == WinUser.WM_COMMAND)
        {
            int wNotCode = HIWORD(wParam);
            if (wNotCode == WinUser.CBN_SELCHANGE || wNotCode == WinUser.EN_CHANGE)
            {
               // Child field has changed
            }
        }

        base.WndProc(ref m);
    }

注意:这只适用于子控件。如果你想在根控件中处理EN_CHANGE通知,你必须向上传播WM_COMMAND消息。

相关问题