0

私はフォルダーのリストを表示するためのツリービューを持っているWindowsフォームアプリで作業しており、NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)イベントを添付しています。ノードをクリックすると、サーバーメソッドを呼び出してツリービューにデータを入力します。ここで、ツリー ノードの 1 つの NodeMouseClick がまったくトリガーされていないことがわかります。ただし、残りのノードでは問題なく正常に動作します。トリガーされない正確な理由を誰か教えてください。After_Select イベントを使用したくありません。

public Form1()
    {
        InitializeComponent();
        Init();
    }

    private void Init()
    {
        treeView1.Nodes.Add("root");

        for (int i = 0; i < 23; i++)
        {
            treeView1.Nodes[0].Nodes.Add(i.ToString());
            treeView1.Nodes[0].Nodes[i].Nodes.Add("child" + i.ToString());
        }

        treeView1.Nodes[0].Expand();
    }

サイズ = 280,369 のツリービューを使用

4

2 に答える 2

1

前にコメントで述べたように、回避策は、Windows API のレベルにドロップダウンし、マウス メッセージをインターセプトし、自分でノード クリック イベントを発生させることです。コードは醜いですが、機能的です。

プロジェクトの新しいクラスに次のコードを追加します (私はそれを と呼びましたCustomTreeView)。

class CustomTreeView : System.Windows.Forms.TreeView
{
    public event EventHandler<TreeNodeMouseClickEventArgs> CustomNodeClick;

    private const int WM_LBUTTONDOWN = 0x201;

    protected override void WndProc(ref System.Windows.Forms.Message m)
    {
        if (m.Msg == WM_LBUTTONDOWN)  // left mouse button down
        {
            // get the current position of the mouse pointer
            Point mousePos = Control.MousePosition;

            // get the node the user clicked on
            TreeNode testNode = GetNodeAt(PointToClient(mousePos));

            // see if the clicked area contained an actual node
            if (testNode != null)
            {
                // A node was clicked, so raise our custom event
                var e = new TreeNodeMouseClickEventArgs(testNode,
                                 MouseButtons.Left, 1, mousePos.X, mousePos.Y);
                if (CustomNodeClick != null)
                    CustomNodeClick(this, e);
            }
        }

        // call through to let the base class process the message
        base.WndProc(ref m);
    }
}

次にSystem.Windows.Forms.TreeView、コード内のコントロールへのすべての参照を、作成したばかりの新しいCustomTreeViewクラスに変更します。これは、代わりに使用する既存のコントロールのサブクラスです。TreeViewサブクラス化に慣れていない場合は、これが既存の機能を変更する方法、または既存のコントロールに新しい機能を追加する方法です。この場合、元のコントロールをサブクラス化して、ノードがユーザーによってクリックされたことを検出するたびに発生するイベントTreeViewを追加しました。CustomNodeClick

最後に、フォーム クラスのイベント ハンドラー メソッドを変更して、以前に使用しようとしていたバグのあるイベントCustomNodeClickではなく、発生させているイベントをリッスンしNodeMouseClickます。

コンパイルして実行します。すべてが期待どおりに動作するはずです。

于 2011-02-01T14:38:03.733 に答える
0

AfterSelectノード選択後にトリガーする必要があるイベントを使用してみてください。

于 2011-01-30T07:08:40.157 に答える