0

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

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

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

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

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

4

6 回答 6

1

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

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

public event EventHandler<EventArgs> YouEventName;

你称它为一种方法:

this.YourEventName(this,EventArgs.Emtpy);

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

protected virtual void OnYourEventName()
{
    if (this.YourEventName != null)
    {
        this.YourEventName(this, EventArgs.Empty);
    }
}
于 2012-07-11T09:25:19.097 回答
1

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

于 2012-07-11T09:27:41.047 回答
1

您可以只传播 Treeview 的事件。

您可以将其添加到您的自定义控件中,它将有一个SelectedNodeChanged事件。

public event EventHandler SelectedNodeChanged
{
   add { tree.SelectedNodeChanged += value; }
   remove { tree.SelectedNodeChanged-= value; }
}
于 2012-07-11T09:29:48.940 回答
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;
}
于 2012-07-11T09:39:57.463 回答
0

创建新事件

public event EventHandler<EventArgs> myEvent;

然后你从某个方法调用它

this.myEvent(sender, e);

实际事件看起来像这样:

protected void MyEvent(object sender, EventArgs e)
{
    //Your code here
}
于 2012-07-11T09:37:58.383 回答
0

你的代码可以是这样的:

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.");
  }
于 2012-07-11T09:39:26.580 回答