2012-03-19 28 views
7

Tôi gặp listview của tôi như saulàm thế nào để kích hoạt menu ngữ cảnh cho mục listview không cho Headers Cột

Header1  Header2  Header3 
    Item1  Item2  Item3 
    Item1  Item2  Item3 
    Item1  Item2  Item3 

Tôi đã viết một mã số để hiển thị context menu trên cách nhấn vào list view nhưng nó được hiển thị Context menu trên headers quá . Tôi cần phải hiển thị Context menu chỉ khi người dùng nhấp vào Items của list view bất cứ ai có thể giúp tôi

Đây là mã của tôi, tôi viết có mặt tại

private void listView1_MouseClick(object sender, MouseEventArgs e) 
    { 
     contextMenuStrip1.Show(listView1, e.Location); 
    } 
+3

Bạn đã thử đặt HeaderStyle thành không thể nhấp không? – kaj

+0

Cảm ơn 'KAJ' đã giải quyết – Vivekh

+0

Vẫn còn vấn đề tương tự – Vivekh

Trả lời

0

này khá bẩn ... chỉ cần sử dụng các thông tin trong tầm tay . Ai đó có lẽ sẽ đến với một câu trả lời tốt hơn.

private void listView1_MouseClick(object sender, MouseEventArgs e) 
{ 
    if (e.Location.Y > headerHeightDefinedEarlier) 
     contextMenuStrip1.Show(listView1, e.Location); 
} 
+0

ý của bạn là gì bởi 'headerHeightDefinedEarlier' – Vivekh

+0

Tôi có nghĩa là bạn định nghĩa headerHeight ở đâu đó trong mã. Bạn cũng có thể thay thế mã bằng if (e.Location.Y> 15), nhưng như tôi đã nói, nó bị bẩn. – maka

0

Bạn nên chọn mục khi bạn đang thực hiện nhấp vào mục đó. Sau đó, bạn có thể yêu cầu các selecteditems trong danh sách và có được các chỉ số thành phần được chọn: listView1.SelectedItems[0].Index

if (listView1.SelectedItems[0].Index == 0) 
return; 
+0

Tôi cũng nghĩ về điều này. Vấn đề ở đây tôi nghĩ rằng nếu bạn lần đầu tiên chọn một mục, sau đó nhấp chuột phải vào tiêu đề, menu ngữ cảnh vẫn sẽ được hiển thị nguyên nhân bạn vẫn có mục trước đó của bạn được chọn. – maka

+0

Bạn nên chọn mục trong sự kiện SelectedIndexChanged – mggSoft

5

Bạn có thể hủy xem các menu ngữ cảnh nếu không có các mục đã chọn, mà sẽ chỉ có giá trị nếu bạn click chuột phải một mục

/// <summary> 
    /// ContextMenuStrip Opening Action 
    /// </summary> 
    private void listContextMenuStrip_Opening(object sender, CancelEventArgs e) 
    { 
     // If there are no items selected, cancel viewing the context menu 
     if (connectionListView.SelectedItems.Count <= 0) 
     { 
      e.Cancel = true; 
     } 
    } 
+3

+1 để sử dụng sự kiện này. Nhiều bàn phím tương thích hơn tùy thuộc vào mouseclick. – James

13

Làm thế nào về điều này?

private void listView1_MouseClick(object sender, MouseEventArgs e) 
    { 
     ListView listView = sender as ListView; 
     if (e.Button == System.Windows.Forms.MouseButtons.Right) 
     { 
      ListViewItem item = listView.GetItemAt(e.X, e.Y); 
      if (item != null) 
      { 
       item.Selected = true; 
       contextMenuStrip1.Show(listView , e.Location); 
      } 
     } 
    } 

Điều này thiết lập để trình đơn ngữ cảnh chỉ hiển thị nếu nhấp chuột phải xảy ra trên một mục, bởi vì nếu nhấp chuột phải xảy ra trên tiêu đề hoặc mục khác thì mục đó sẽ rỗng. Hy vọng nó giúp

9

Điều này có thể hữu ích cho bạn

private void listView1_MouseClick(object sender, MouseEventArgs e) 
    {    
     if (e.Button == MouseButtons.Right) 
     { 
      if (listView1.FocusedItem.Bounds.Contains(e.Location) == true) 
      { 
       contextMenuStrip1.Show(Cursor.Position); 
      } 
     } 
    } 

Các "Bounds" bất động sản là một hình chữ nhật đại diện cho các cạnh của "FocusedItem" bằng pixel. Vì vậy, nếu con trỏ nằm trong khu vực hình chữ nhật này khi nhấp chuột phải thì "contextMenuStrip1" xuất hiện.

Các vấn đề liên quan