【问题标题】:Alternative to PageLoad in Windows FormsWindows 窗体中 PageLoad 的替代方案
【发布时间】:2012-08-29 08:55:02
【问题描述】:

我在Windows Forms 表单上有很多活动。我有一个反馈标签,我必须写 feedbaxk.Text="";在每个事件的开始。

ASP.NET 中,我一直在每次回发时触发的page_load 事件中只写一次,但表单加载只触发一次。

我尝试用我的问题的标题进行搜索,发现以下两个最接近的答案:

有一些相关材料,但我无法从这些以及更多其他材料中得到满意的答案。

如何在 Windows 窗体中检测将要触发的事件?

更新:通过另一种方式谷歌搜索,我发现了一个与另一个链接链接的关闭链接,Find all event handlers for a Windows Forms control in .NETIs it possible to “steal” an event handler from one control and give it to another?。看完这些我觉得有可能

  1. 我可以在 Form_Load 结束时以 win 形式获取所有事件的列表(之后我不再添加任何事件)。然后为所有事件添加一些通用功能(比如更改标签文本)。
  2. 我或许能够从父事件继承我的所有事件,并在该事件中添加我想要的功能,然后为每个事件添加(覆盖)特定功能。

【问题讨论】:

  • 许多事件(不是全部)是由于底层 Windows 消息到达窗体窗口句柄而引发的,因此您可以覆盖受保护的 Form.WndProc 方法并尝试编写一些包罗万象的系统。根据您最终想要实现的目标,这可能是一个开始。
  • 我赞同@SimonMourier 所说的话。连接到 WndProc 应该足以满足您的需要。
  • 我正在研究 SimonMourier 指导。 @利夫!它不仅仅是关于按钮点击,它是关于所有添加的事件,例如一个 textbox_leave 一个 combobox_selectedIndex_Changed 一个 textbox_backgroudColorChanged 等等...
  • 通过另一种方式谷歌搜索,我发现了一个与另一个链接链接的关闭链接....stackoverflow.com/questions/3855985/… ------ stackoverflow.com/questions/293007/… ----- @HansPassant。你已经回答了一些类似的问题。请参阅我的更新。我期待你能最好地回答这个问题

标签: c# winforms postback desktop-application


【解决方案1】:

这取决于您要处理的任何特定事件,因为在您的窗口中您可以有 Resize、Click、Move 等事件。看看您参考 ASP.NET 提出的观点,您似乎想要在某些按钮单击时处理此问题。

您可以尝试覆盖 WndProc 并处理 WM_COMMAND 消息。如果您想在单击某个特定按钮时处理此问题,那么我会说您为每个按钮处理此问题。

【讨论】:

  • +1。只需覆盖 WndProc。您会发现发生的事情比在 ASP.NET 回发中得到的要多得多,因此您需要专门过滤消息以“从消防软管中啜饮”,因此您只需要处理您关心的内容关于。
  • 对。我试试看。正如所讨论的那样,所有事件都需要一个公共事件。意味着不会有任何事件不会触发该公共事件,例如组合框的 selectedindexchanged 或单击的按钮等
【解决方案2】:

如果您想在所有按钮单击事件上运行一些代码,您可以创建一个如下所示的辅助方法,它将一个方法附加到表单上所有按钮的单击事件处理程序。

public static class UIHelper
{
    public static void RegesterButtonClicks(Form form, EventHandler method)
    {
        foreach (Control control in form.Controls)
        {
            if (control is Button)
            {
                control.Click += method;
            }
        }
    }
}

然后创建在所有按钮点击时运行的方法。像这样的:

private void OnButtonClick(object sender, EventArgs e)
{
    //Code for all clicks here
}

然后在InitializeComponent()下添加如下代码行;构造函数中的一行

UIHelper.RegesterButtonClicks(this, OnButtonClick);

如果需要,您还可以扩展辅助方法以将该方法附加到其他事件和其他类型的控件。

【讨论】:

    【解决方案3】:

    您可以使用AOP 执行此操作。使用 Unity(Unity 应用程序块)框架来装饰您的 Windows 窗体窗体中的所有事件方法。在事件方法调用之前调用您的自定义方法。

    使用反射和proxy pattern 很容易实现和隐藏代码。相关文章是Aspect-Oriented Programming, Interception and Unity 2.0

    【讨论】:

    • 好吧。感谢您的指导,我将研究这些东西并尝试更新,因为目前我不知道这些东西。对我来说这似乎是一件艰难的事情。
    • 我了解,但这是正确执行此操作的唯一方法。您还可以将所有 Windows 窗体事件关联到同一个方法,但这会非常困难(在像控制器这样的方法中,您必须检测哪个控件和哪个事件将其路由到具有大开关盒的好方法上,它很难而且很糟糕)...
    • aop 是所有横向过程(技术日志、安全性等)的答案。一天就足够下载unity并设置aop了,你会发现它很容易;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 2011-11-18
    • 1970-01-01
    • 2020-10-06
    • 2015-02-22
    相关资源
    最近更新 更多