0

我正在尝试覆盖标准 TreeView 控件中的一个简单方法;

public class treeView1 : TreeView
{
    protected override void OnMouseUp(MouseEventArgs e)
    {
        MessageBox.Show("Are we getting here?");
        base.OnMouseUp(e);
    }
}

看起来很简单,但我不明白为什么不调用它。我从 TreeView 控件调用继承,并进行基本覆盖。TreeView 被调用treeView1并响应其父类上的事件方法,而不是被覆盖的事件方法,为什么!?

另外我不想创建自定义用户控件,只想保持这个基本。谢谢。

编辑:我在 Form1.Designer.cs 中创建了树视图

private System.Windows.Forms.TreeView treeView1;

& 用以下内容初始化;

// 
// treeView1
// 
this.treeView1.Location = new System.Drawing.Point(13, 316);
this.treeView1.Name = "treeView1";
this.treeView1.Size = new System.Drawing.Size(539, 474);
this.treeView1.TabIndex = 2;
this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect);
this.treeView1.MouseUp += new System.Windows.Forms.MouseEventHandler(this.treeView1_MouseUp);
4

2 回答 2

2

使用此声明,您正在创建一个新的“类型”,它派生自 TreeView,可用于声明以自定义方式运行的实例。

你没有显示你的使用代码(编辑- 现在你有),但我敢打赌,显示在表单上的实际控件仍然被声明:

protected System.Windows.Forms.TreeView treeView1;

如果确实如此,那么您没有使用派生类型;实际控件仍然是内置 TreeView 类的实例,而不是您的派生类。因此,在运行时,您的对象的方法不会被调用,因为您的对象甚至没有被使用。

相反,您必须将控件声明为新类的实例:

protected treeView1 treeView1;

...然后还要确保它是这样实例化的:

private void InitializeComponents()
{
    ...
    treeView1 = new treeView1(); //not System.Windows.Forms.TreeView
    ...
}

为了避免类型和该类型的实例之间的混淆,我将使用 UpperCamelCase 命名约定定义派生类:TreeView1.

编辑:感谢您展示用法。这绝对是我想的那样;您的变量 treeView1 是内置 System.Windows.Forms.TreeView 的一个实例,而不是您自定义的派生 treeView1 类。类名和类实例名有很大区别。正确的声明应该是:

private treeView1 treeView1;

...我重申类名应该使用 UpperCamelCase 命名约定:

public class TreeView1 : TreeView
{
    protected override void OnMouseUp(MouseEventArgs e)
    {
        MessageBox.Show("Are we getting here?");
        base.OnMouseUp(e);
    }
}

...
//now when declaring it it'll be easier to tell the difference
private TreeView1 treeView1;
于 2012-08-31T15:41:28.080 回答
0

该事件应该正常工作。根据您的班级名称,我将假设您没有正确实施它。

首先,您需要创建一个新类并从树视图继承:

class MyTreeView : TreeView

添加您的覆盖方法

class MyTreeView : TreeView
{
    protected override void OnMouseUp(MouseEventArgs e)
    {
        MessageBox.Show("Are we getting here?");
        base.OnMouseUp(e);
    }

}

然后确保你编译你的项目一次。之后,具有您的类名称的新控件应位于工具箱中的“组件”下。只需将该控件拖放到您的表单中,然后从那时起使用该控件。

于 2012-08-31T15:41:47.507 回答