2011-10-21 19 views

回答

6

一個簡單的用戶控件重寫ListViewOnMouseEnterOnMouseLeave & WndProc

public partial class MyListView : ListView 
{ 
    public MyListView() 
    { 
    } 

    public delegate void ColumnContextMenuHandler(object sender, ColumnHeader columnHeader); 
    public event ColumnContextMenuHandler ColumnContextMenuClicked = null; 

    bool _OnItemsArea = false; 
    protected override void OnMouseEnter(EventArgs e) 
    { 
     base.OnMouseEnter(e); 
     _OnItemsArea = true; 
    } 

    protected override void OnMouseLeave(EventArgs e) 
    { 
     base.OnMouseLeave(e); 
     _OnItemsArea = false; 
    } 

    const int WM_CONTEXTMENU = 0x007B; 

    protected override void WndProc(ref Message m) 
    { 
     if (m.Msg == WM_CONTEXTMENU) 
     { 
      if (!_OnItemsArea) 
      { 
       Point p = base.PointToClient(MousePosition); 
       int totalWidth = 0; 
       foreach (ColumnHeader column in base.Columns) 
       { 
        totalWidth += column.Width; 
        if (p.X < totalWidth) 
        { 
         if (ColumnContextMenuClicked != null) ColumnContextMenuClicked(this, column); 
         break; 
        } 
       } 
      } 
     } 
     base.WndProc(ref m); 
    } 
} 

和使用

myListView1.ColumnContextMenuClicked += (sndr, col) => 
{ 
    this.Text = col.Text; 
}; 
+0

謝謝,它的工作原理。它告訴我,我只能在20小時內獎勵積分。那麼會那麼做。 –

+0

不是技術上的'UserControl',而是meh ... –

+0

@EdS .:這是什麼意思?我認爲這是一個繼承自ListView的自定義控件,不是嗎? –

0

的OnMouseEnter在/離開溶液顯示的上下文菜單有時甚至不能在報頭中。這裏是更好的解決方案ListView ContextMenuStrip for column headers

+0

有了更多的代表,[你將能夠標記像這樣的重複問題](https://stackoverflow.com/privileges/comment)。在此之前,將鏈接發佈爲答案並不是很理想,並且通常會被刪除。或者,如果問題不是重複的,*定製這個特定問題的答案*。 –

相關問題