チェックボックス付きのツリービューがあります。これがチェックボックスで行われた場合にのみ、ダブルクリックを無効にしようとしています。
ダブルクリックを完全に無効にする方法を見つけましたが、それは私が望んでいたものではありませんでした。
助けていただければ幸いです。
同じバグをグーグルで検索すると、この質問が見つかりました。NoodleFolk のソリューションの問題点は、項目をダブルクリックしても 3 つの項目を展開できないことです。NoodleFolk の回答と john arlens の回答を組み合わせると、次のようになります。
class NewTreeView : TreeView
{
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x203) // identified double click
{
var localPos = PointToClient(Cursor.Position);
var hitTestInfo = HitTest(localPos);
if (hitTestInfo.Location == TreeViewHitTestLocations.StateImage)
m.Result = IntPtr.Zero;
else
base.WndProc(ref m);
}
else base.WndProc(ref m);
}
}
私は(すぐに)このソリューションをテストしましたが、うまくいくようです。
オプション1:ダブルクリックイベントを完全に無効にします。
カスタマーコントロールを作成する
クラスMyTreeView:TreeView {{ 保護されたオーバーライドvoidWndProc(refメッセージm) {{ if(m.Msg == 0x0203) {{ m.Result = IntPtr.Zero; } そうしないと {{ base.WndProc(ref m); } } }
デザイナーファイル(form.Designer.cs)で、コントロールが作成された場所を探し、TreeViewコンストラクターの呼び出しを新しいコントロールに置き換えます。
this.treeView1 = new MyTreeView();
オプション2:ダブルクリックイベントを2つのシングルクリックイベントとして扱います
クラスMyTreeView:TreeView {{ 保護されたオーバーライドvoidWndProc(refメッセージm) {{ if(m.Msg == 0x0203) {{ m.Msg = 0x0201; } base.WndProc(ref m); } }
個人的には、オプション2の方が直感的だと思います。ユーザーがチェックボックスを2回クリックすると、チェックボックスはオフになります。
CheckBox から発生した DoubleClick イベントを知りたいだけの場合:
private void TreeViewDoubleClick(object sender, EventArgs e)
{
var localPosition = treeView.PointToClient(Cursor.Position);
var hitTestInfo = treeView.HitTest(localPosition);
if (hitTestInfo.Location == TreeViewHitTestLocations.StateImage)
return;
// ... Do whatever other processing you want
}
上記の回答を組み合わせて、これが私にとって最良の解決策であることがわかりました。ノードをダブルクリックしてその子を展開することは引き続き機能しますが、チェックボックスをダブルクリックすることのみが影響を受けて修正されます。
class MyTreeView : TreeView
{
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0203 && this.CheckBoxes)
{
var localPos = this.PointToClient(Cursor.Position);
var hitTestInfo = this.HitTest(localPos);
if (hitTestInfo.Location == TreeViewHitTestLocations.StateImage)
{
m.Msg = 0x0201;
}
}
base.WndProc(ref m);
}
}