重写的Winforms树视图方法未被调用

时间:2012-08-31 15:35:38

标签: c# winforms treeview

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

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

看起来很简单,但我无法理解为什么它没有被调用。我从TreeView控件调用inherit,并执行基本覆盖。 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);

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

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

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

class MyTreeView : TreeView

添加覆盖方法

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

}

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