2013-02-01 28 views
12

Tôi có một hộp kiểm với hộp kiểm, tôi đang cố gắng vô hiệu hóa bấm đúp chỉ khi điều này được thực hiện trong hộp kiểm.C# treeview bỏ qua nhấp đúp chỉ tại hộp kiểm

Tôi đã tìm thấy một cách để vô hiệu hóa hoàn toàn nhấp đúp nhưng đó không phải là những gì tôi muốn.

Tôi đánh giá cao nếu bạn có thể giúp tôi.

Trả lời

4

Nếu bạn chỉ muốn biết một sự kiện DoubleClick xảy ra từ CheckBox:

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 
} 
+0

Nó hoạt động rất tốt. –

+0

Tôi biết rằng phải có cách nào tốt hơn những gì tôi trả lời, nhưng không thể hiểu được. +1 – TaRDy

+1

Tôi không chắc chắn điều này có hiệu quả không. Lỗi này dường như thực sự làm tắc nghẽn tất cả các sự kiện nhấp đúp. Nếu bạn nhấp đúp vào hộp kiểm, không có sự kiện nhấp đúp nào kích hoạt. Nếu bạn sau đó nhấp chuột duy nhất khá nhiều bất cứ nơi nào, * sau đó * các sự kiện nhấp đúp lửa, nhưng vì họ đã bắn quá muộn, họ kết thúc với thông tin sai trong eventargs của họ. –

9

Lựa chọn 1: Hoàn toàn vô hiệu hóa các sự kiện nhấn đúp chuột.
Tạo một điều khiển khách hàng

 
class MyTreeView : TreeView 
{ 
    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == 0x0203) 
     { 
      m.Result = IntPtr.Zero; 
     } 
     else 
     { 
      base.WndProc(ref m); 
     } 
    } 
} 

và nhà thiết kế tập tin của bạn (form.Designer.cs), hãy tìm nơi điều khiển được tạo ra, và thay thế các cuộc gọi đến constructor TreeView kiểm soát mới của bạn.

this.treeView1 = new MyTreeView();

Lựa chọn 2: Hãy đối xử với một sự kiện click đôi như hai sự kiện nhấp chuột duy nhất

 
class MyTreeView : TreeView 
{ 
    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == 0x0203) 
     { 
      m.Msg = 0x0201; 
     } 
     base.WndProc(ref m); 
    } 
} 

Cá nhân tôi nghĩ rằng phương án 2 là trực quan hơn. Khi người dùng nhấp vào hộp kiểm hai lần, hộp kiểm không được chọn.

11

Tôi đã tìm thấy câu hỏi này khi googling cho cùng một lỗi. Vấn đề với giải pháp của NoodleFolk là nó vô hiệu hóa việc mở rộng ba bằng cách nhấp đúp vào một mục. Bằng cách kết hợp câu trả lời NoodleFolk với john arlens câu trả lời, bạn sẽ nhận được một cái gì đó như thế này:

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); 
    } 
} 

I (nhanh chóng) thử nghiệm giải pháp này, và có vẻ như để làm việc.

0

Kết hợp các câu trả lời ở trên, tôi thấy đây là giải pháp tốt nhất cho tôi. Nhấp đúp vào nút để mở rộng con của nó vẫn hoạt động, chỉ việc nhấp đúp vào hộp kiểm bị ảnh hưởng và cố định:

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); 
    } 
} 
Các vấn đề liên quan