【问题标题】:Creating events for CustomControl为 CustomControl 创建事件
【发布时间】:2012-07-11 17:39:57
【问题描述】:

我正在开发用于选择特殊文件的 UserControl,在此控件中有一个 TreeView,当用户选择某个文件时,它会填充节点。用户也可以从此树视图中删除文件!

我正在以向导形式使用此控件。在此向导表单中,有一个名为 buttonNext 的按钮,默认情况下禁用此按钮。

如何在用户控件中为树视图创建一个事件,当它被填充时,它会通知向导表单中的下一个按钮以启用,如果用户从该树视图中删除所有文件,它会通知该按钮再次被禁用。

P.S: 选择文件(浏览器对话框和类似的东西)都是在这个用户控件中完成的,所以在我的向导表单中我无法访问这个组件中正在发生的事情,但只有我将 TreeView 本身设置为public 所以我可以在我的向导表单中读取它的节点。

我知道如何订阅事件,但我自己从未创建过任何事件:(

【问题讨论】:

标签: c# winforms events


【解决方案1】:

在您的 CustomControl 上声明事件:

public event EventHandler DataPopulated;
public event EventHandler DataRemoved;

通常的做法是创建受保护的虚拟方法(以便在后代类中覆盖它们),命名为 On<EventName>,它将验证事件是否已附加处理程序并引发事件,并传递所需的参数:

protected virtual void OnDataPopulated()
{
    if (DataPopulated != null)
        DataPopulated(this, EventArgs.Empty);
}

注意:如果您需要将一些数据传递给事件处理程序,则使用泛型EventHandler<DataPopulatedEventArgs> 委托作为事件类型,其中DataPopulatedEventArgs 是一个类,继承自EventArgs

然后在填充数据后调用此方法:

treeView.Nodes = GetNodes();
OnDataPopulated();

然后只需订阅此事件并启用您的下一步按钮:

private void CustomControl_DataPopulated(object sender, EventArgs e)
{
   buttonNext.Enabled = true;
}

【讨论】:

    【解决方案2】:

    谁是填充 TreeView 的人?加载数据的人可以在完成加载后启用“下一步”按钮。我错过了什么吗?

    顺便说一句,你创建一个这样的事件:

    public event EventHandler<EventArgs> YouEventName;
    

    你把它当成一种方法来称呼:

    this.YourEventName(this,EventArgs.Emtpy);
    

    最佳实践表明您应该创建一个方法来调用它:

    protected virtual void OnYourEventName()
    {
        if (this.YourEventName != null)
        {
            this.YourEventName(this, EventArgs.Empty);
        }
    }
    

    【讨论】:

    • 您的设计是对的。您应该将事件命名为 OperationDone。您需要在事件中传递任何参数吗?
    【解决方案3】:

    查看这篇 MSDN 文章以获取有关如何创建和触发事件的完整教程。
    http://msdn.microsoft.com/en-us/library/aa645739(v=vs.71).aspx

    【讨论】:

      【解决方案4】:

      您可以只传播 Treeview 的事件。

      你可以把它添加到你的自定义控件中,它会有一个SelectedNodeChanged 事件。

      public event EventHandler SelectedNodeChanged
      {
         add { tree.SelectedNodeChanged += value; }
         remove { tree.SelectedNodeChanged-= value; }
      }
      

      【讨论】:

        【解决方案5】:

        创建一个新事件

        public event EventHandler<EventArgs> myEvent;
        

        然后你从某个方法调用它

        this.myEvent(sender, e);
        

        实际的事件应该是这样的:

        protected void MyEvent(object sender, EventArgs e)
        {
            //Your code here
        }
        

        【讨论】:

          【解决方案6】:

          你的代码可以是这样的:

          public delegate void ChangedEventHandler(object sender, EventArgs e);
          
          class TreeViewEx : TreeView
          {
              ...
          
              public event ChangedEventHandler Changed;
          
              protected virtual void OnChanged(EventArgs e)
              {
                  if (Changed != null)
                      Changed(this, e);
              }
          }
          

          它的用法

            TreeViewEx tree = ...
            tree.Changed += new EventHandler(TreeChanged);
          
          
            // This will be called whenever the tree changes:
            private void TreeChanged(object sender, EventArgs e) 
            {
               Console.WriteLine("This is called when the event fires.");
            }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-04-24
            • 1970-01-01
            • 2020-02-22
            相关资源
            最近更新 更多