2009-08-08 35 views

Trả lời

13

Không có cách nào đơn giản để đạt được điều này, theo như tôi biết. Một ý nghĩ là đặt một biến số bool thành true trên sự kiện DoubleClick và sử dụng thuộc tính e.Cancel của sự kiện BeforeExpand để ngăn nút mở rộng. Tuy nhiên, hai sự kiện đó được bắn theo thứ tự ngược lại, vì vậy đó không phải là một giải pháp. Tôi không có một giải pháp khác từ đỉnh đầu của tôi; sẽ cập nhật nếu tôi nghĩ ra.

Cập nhật

Tôi đã chơi xung quanh với điều này một chút, và tôi đã tìm thấy một cách để làm việc một cách hợp lý tốt. Như tôi đã đề cập vấn đề là BeforeExpand xảy ra trướcDoubleClick, vì vậy, chúng tôi không thể đặt bất kỳ trạng thái nào trong DoubleClick để sử dụng trong BeforeExpand.

Tuy nhiên, chúng tôi có thể phát hiện các nhấp đúp (tiềm năng) theo cách khác: bằng cách đo thời gian giữa các sự kiện MouseDown. Nếu chúng tôi nhận được hai sự kiện MouseDown trong khoảng thời gian xác định nhấp đúp (như được nêu trong SystemInformation.DoubleClickTime), thì đó phải là một nhấp đúp, phải không? Và sự kiện MouseDown được nâng lên trước BeforeExpand. Vì vậy, các mã sau đây làm việc khá tốt:

private bool _preventExpand = false; 
private DateTime _lastMouseDown = DateTime.Now; 

private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e) 
{ 
    e.Cancel = _preventExpand; 
    _preventExpand = false; 
} 

private void treeView1_MouseDown(object sender, MouseEventArgs e) 
{ 
    int delta = (int)DateTime.Now.Subtract(_lastMouseDown).TotalMilliseconds;    
    _preventExpand = (delta < SystemInformation.DoubleClickTime); 
    _lastMouseDown = DateTime.Now; 
} 

tôi nói "khá tốt" bởi vì tôi cảm thấy rằng nó ngăn chặn các nút từ mở rộng trong một số trường hợp khi nó không nên (ví dụ nếu bạn trong vòng nhấn đúp chuột lần nhấp chuột đầu tiên trên văn bản nút và sau đó trên dấu cộng). Điều đó có thể có khả năng giải quyết theo cách nào đó, hoặc có lẽ bạn có thể sống với điều đó.

+1

Trên thực tế, có là một cách rất đơn giản để đạt được điều này. –

+1

@baeltazor: Tôi đã thử giải pháp bạn đề xuất trong câu trả lời của bạn trước khi đăng câu trả lời của tôi. Xem bình luận của tôi dưới câu trả lời của bạn. –

+1

Đó là giải pháp khá thú vị nhưng nó hoạt động :) Cảm ơn :) – arek

2

Xử lý sự kiện BeforeExpand và đặt thuộc tính Hủy sự kiện đối tượng không đúng.

private void OnBeforeExpand(object sender, TreeViewCancelEventArgs e) 
{ 
    e.Cancel = true; 
} 

Các TreeViewCancelEventArgs cũng chứa các nút bị ảnh hưởng và hành động mà gây ra sự kiện, do đó bạn có thể thực hiện một logic phức tạp hơn để kích hoạt hoặc vô hiệu hóa các hành vi mở rộng hơn so với ví dụ đơn giản của tôi.

+0

Hi, Đáng tiếc là tôi don 't thấy hành động (như DoubleClick hoặc đơn giản mở rộng) trong TreViewCancelEventArgs – arek

2

Có. Bạn có thể làm được việc này.

Một nơi nào đó bởi bản thân trong các mã viết này:

bool CanExpand = true; 

... và bên trong handler doubleclicked viết này:

CanExpand = false; 

....... và bên trong um. sự kiện BeforeExpand, nhập thông tin này:

if(CanExpand) 
    Application.DoEvents(); 
else e.Cancel = true; 

Tôi hy vọng điều này đã hữu ích.


Tôi vừa thử nghiệm tính năng này và hoạt động hoàn hảo. :-) Dưới đây là toàn bộ mã mà tôi đã sử dụng để kiểm tra nó.Vì vậy, bạn có thể xem làm thế nào nó hoạt động:


using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     bool CanExpand = true; 

     private void treeView1_DoubleClick(object sender, EventArgs e) 
     { 
      CanExpand = false; 
     } 

     private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e) 
     { 
      if (CanExpand) 
       Application.DoEvents(); 
      else 
       e.Cancel = true; 
     } 
    } 
} 
+1

Tôi vừa thử điều này và nó cho thấy hành vi * rất * không nhất quán (nó cho phép mở rộng đầu tiên trên doubleclick, vì 'BeforeExpand' được nâng lên trước' DoubleClick', sau đó nó chặn nỗ lực mở rộng tiếp theo, bất kể nó được kích hoạt như thế nào) . Ngoài ra, mã của bạn có lẽ nên đặt 'CanExpand = true' cuối cùng trong trình xử lý sự kiện' BeforeExpand', hoặc nó sẽ chặn tất cả các lần thử mở rộng trong tương lai. –

18
private void treeView1_BeforeCollapse(object sender, TreeViewCancelEventArgs e) 
{ 
    if (blnDoubleClick == true && e.Action == TreeViewAction.Collapse) 
     e.Cancel = true; 
} 

private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e) 
{ 
    if (blnDoubleClick == true && e.Action == TreeViewAction.Expand) 
     e.Cancel = true; 
} 

private void treeView1_MouseDown(object sender, MouseEventArgs e) 
{ 
    if (e.Clicks > 1) 
     blnDoubleClick = true; 
    else 
     blnDoubleClick = false; 
} 

Bạn có thể mất một biến boolean như: bool blnDoubleClick tin = false; và thiết lập các sự kiện treeview khác nhau như sau. Điều này sẽ ngăn chặn mở rộng/thu hẹp nút treeview khi nhấp đúp. Tuy nhiên mở rộng/thu gọn sẽ hoạt động thông qua các biểu tượng + và -.

+1

Bạn có thể sử dụng biến boolean như: riêng bool blnDoubleClick = false; và đặt các sự kiện khác nhau về số lần xem trang như sau. Điều này sẽ ngăn chặn mở rộng/thu hẹp nút treeview khi nhấp đúp. Tuy nhiên mở rộng/thu gọn sẽ hoạt động thông qua các biểu tượng + và -. –

+1

Đây phải là câu trả lời được chấp nhận, vì nó không phụ thuộc vào việc biết thời gian Doubleclick – Dan

+0

Tôi đồng ý điều này nên là câu trả lời được loại trừ. Làm việc hoàn hảo và siêu đơn giản để thực hiện. – Tizz

0

Dưới đây là một giải pháp đơn giản:

int treeX; // somewhere in class scope 

// Add a MouseMove event handler 
private void treeView1_MouseMove(object sender, MouseEventArgs e) 
{ 
    treeX = e.X; 
} 

// Add a BeforeExpand event handler 
private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e) 
{ 
    if (treeX > e.Node.Bounds.Left) e.Cancel = true; 
} 
+0

Tôi sợ, điều này sẽ ngăn chặn việc mở rộng mọi khi chuột vượt qua nút (trên thực tế, vì bạn chỉ kiểm tra tọa độ x, nó cũng có thể xảy ra khi chuột ở trên bất kỳ nút nào khác ...). Mở rộng shoul chỉ được ngăn chặn trong trường hợp nhấp đúp chuột theo câu hỏi. – MartinStettner

1

Tôi biết chủ đề này là khá cũ, nhưng có cùng một vấn đề bây giờ và tìm thấy giải pháp thay thế. Tôi không chắc chắn nếu treeView_blockInfo_NodeMouseDoubleClick đã có sẵn tại thời chủ đề này đã được mở ra, nhưng giải pháp của tôi là để đính kèm sự kiện này và sử dụng đoạn mã này:

private void treeView_blockInfo_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e) 
{ 
    if (!e.Node.IsExpanded) 
    { 
     e.Node.Expand(); 
    } 
    else 
    { 
     e.Node.Collapse(); 
    } 
} 

trình cho tôi (mặc dù tôi đã không kiểm tra này để chiều sâu). Vấn đề duy nhất tôi có thể nghĩ là nó có thể gây ra nhấp nháy.

-2

đơn giản nhất cách:

treeList.OptionsBehavior.AllowExpandOnDblClick = false; 
+0

Giải pháp này không áp dụng cho một treelist Winforms. Tôi nghĩ rằng điều này (https://documentation.devexpress.com/#windowsforms/DevExpressXtraTreeListTreeList_OptionsBehaviortopic) kiểm soát là những gì tác giả của câu trả lời này được sử dụng. – transistor1

3

Một MouseDown Sự kiện này sẽ diễn ra trước khi các sự kiện BeforeExpand/BeforeCollapse. Bạn có thể kiểm tra Nhấp chuột tài sản của MouseEventArg để phân biệt giữa một DoubleClick và một nhấp chuột duy nhất:

bool dblClick; 

private void treeView_MouseDown(object sender, MouseEventArgs e) 
{ 
    dblClick = e.Button == MouseButtons.Left && e.Clicks == 2; 
} 

private void treeView_BeforeExpand(object sender, TreeViewCancelEventArgs e) 
{ 
    if (e.Action == TreeViewAction.Expand) e.Cancel = dblClick; 
} 
Các vấn đề liên quan