0

標準の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);
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

イベントは正しく機能するはずです。あなたのクラス名に基づいて、私はあなたがそれを正しく実装していないと思います。

まず、新しいクラスを作成し、treeviewから継承する必要があります。

class MyTreeView : TreeView

オーバーライドメソッドを追加する

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

}

次に、プロジェクトを1回コンパイルするようにしてください。その後、クラスの名前を持つ新しいコントロールがツールボックスの[コンポーネント]の下に表示されます。そのコントロールをフォームにドラッグアンドドロップして、その時点から使用します。

于 2012-08-31T15:41:47.507 に答える