前にコメントで述べたように、回避策は、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
ます。
コンパイルして実行します。すべてが期待どおりに動作するはずです。