2

私はMyForm.cs, MyForm.Designer.cs自分のプロジェクトにファイルを持っています、私MyForm.Designer.csはこのようにしました:

private System.Windows.Forms.TreeView myTreeView;
this.myTreeView = new System.Windows.Forms.TreeView();
.........
this.myTreeView.AfterSelect += 
                           new TreeViewEventHandler(this.myTreeView_AfterSelect);

このようにMyForm.cs

private void myTreeView_AfterSelect(object sender, TreeViewEventArgs e)
        {
          //........;
        }

また、私はCostumeTreeView他のファイル(CostumeTreeView.csおよびCostumeTreeView.Designer.cs)にクラスを持っています、 CostumeTreeView.Designer.cs私はこのようにしました:

private System.Windows.Forms.TreeView myCostumeTreeView
this.myCostumeTreeView = new System.Windows.Forms.TreeView();
...........
this.myCostumeTreeView.DrawMode = 
                          System.Windows.Forms.TreeViewDrawMode.OwnerDrawAll;
this.myCostumeTreeView.DrawNode += 
               new DrawTreeNodeEventHandler(this.myCostumeTreeView_DrawNode);

CostumeTreeView.cs

private void myCostumeTreeView_DrawNode(object sender, DrawTreeNodeEventArgs e)
        {
        ........
            //Here is the problem, myTreeView isn't seen here
            e.Node.Tag = myTreeView.SelectedNode.Text; 
        }

myTreeViewのノードが選択されている場合、after select関数を使用してすべてのタグが変更される必要がありmyCostumeTreeViewます(すべてのメソッドは1つの名前空間にあります)

4

3 に答える 3

2

TreeViewコントロールが異なるフォーム上にある場合、コントロールが相互に通信できるように、フォームプロパティまたはイベントを介して相互に参照する必要があります。

e.Node.Tag = myTreeView.SelectedNode.Text;私が見ているもう1つのことは、DrawNodeイベントで行っているdrawまたはpaintイベントでプロパティを設定するべきではないということです。DrawNodeイベントで実行する必要があるのは、ノードを描画することだけです。それ以外のことはほとんどありません。

参照を作成するには、コスチュームフォームに変数が必要であり、次のようにコンストラクターに渡すだけです。

private MyForm mainForm;

private CostumeTreeView(MyForm mf) {
  InitializeComponents();
  mainForm = mf;
}

これで、TreeViewコントロールを参照できます。

private void myCostumeTreeView_DrawNode(object sender, DrawTreeNodeEventArgs e) {
  ........
  e.Node.Tag = mainForm.myTreeView.SelectedNode.Text; 
}

繰り返しますが、DrawNodeイベントを使用してノードのタグを設定する必要はありません。GUIへの依存関係を作成しているため、将来のメンテナンスとデバッグが困難になります。

于 2012-08-08T20:35:23.563 に答える
0

コーディネータークラスを作成し、両方のツリーをコーディネーターに渡します。コーディネーターに、一方のツリーを選択した後にサブスクライブさせ、選択後に、もう一方のツリーで想定されていることを実行します。

私が何かを逃していない限り、所有者がすべてを描く必要はありません。

于 2012-08-08T20:38:25.257 に答える
0

最良のオプションは、TreeNodeクラスに存在するTreeviewプロパティにアクセスすることだと思います。

    e.Node.Tag = e.Node.TreeView.SelectedNode.Text; 

あなたはそれにアクセスする必要があります。

于 2012-11-09T14:50:20.177 に答える