我正在尝试覆盖标准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);
答案 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);
}
}
然后确保您的项目编译一次。之后,具有类名称的新控件应位于工具箱中的“组件”下。只需将该控件拖放到表单中,然后从该点开始使用该控件。