[WinForm]DataGridView列頭右鍵菜單



前言
  繼續"不誤正業" - - #,記錄一下。有時候有這樣的需求:DataGridView的列頭菜單可以選擇具體顯示哪些列,而數據區域的菜單顯示增刪改查,這樣就需要設置兩個菜單了,而DataGridView並沒有為列頭設置菜單的選項,這里分享一段代碼。

 

聲明
  歡迎轉載,但請保留文章原始出處:) 
    博客園:http://www.cnblogs.com
    農民伯伯: http://over140.cnblogs.com

 

正文 

  一、拖拽一個ContextMenuStrip到界面上,設置好列頭要顯示的菜單,可以通過編程來動態設置。

 

      二、為DataGridView設置ColumnHeaderMouseClick事件:

         private  void DataGridView1_ColumnHeaderMouseClick( object sender, DataGridViewCellMouseEventArgs e)
        {
             if (e.Button == MouseButtons.Right)
            {
                Point point = DataGridView1.PointToScreen( new Point( 00));
                 int x =  0;
                DataGridViewColumnCollection columns = DataGridView1.Columns;
                 for ( int i =  0; i < e.ColumnIndex; i++)
                {
                     if (columns[i].Visible)
                        x += columns[i].Width;
                }
                menu1.Show(DataGridView1.PointToScreen( new Point(x + e.X, e.Y)));
            } 

        }  

代碼說明:

1.  只處理右鍵事件

2.  處理隱藏列的問題和菜單顯示位置。

 

三、效果圖:

 

 

  四、后期維護

    2012-5-1  如果同時設置了DataGridView的ContextMenuStrip,上面的代碼將不執行,可使用下列代碼:

         ///   <summary>
        
///  顯示菜單
        
///   </summary>
        
///   <param name="grid"></param>
        
///   <param name="menu"></param>
        
///   <param name="e"></param>
         private  void ShowMenu(DataGridView grid, ContextMenuStrip menu, DataGridViewCellMouseEventArgs e)
        {
            Point point = grid.PointToScreen( new Point( 00));
             int x =  0, y =  0;

             foreach (DataGridViewColumn column  in grid.Columns)
            {
                 if (column.Index >= e.ColumnIndex)
                     break;
                 if (column.Visible)
                    x += column.Width;
            }

             foreach (DataGridViewRow row  in grid.Rows)
            {
                 if (row.Index > e.RowIndex)
                     break;
                 if (row.Visible)
                    y += row.Height;
            }
            menu.Show(grid.PointToScreen( new Point(x + e.X, y + e.Y)));

        }

    調用代碼:

         ///   <summary>
        
///  右鍵列頭
        
///   </summary>
        
///   <param name="sender"></param>
        
///   <param name="e"></param>
         private  void DataGridView1_ColumnHeaderMouseClick( object sender, DataGridViewCellMouseEventArgs e)
        {
             if (e.Button == MouseButtons.Right)
            {
                ShowMenu(DataGridView1, headMenu, e);
            }
        }

         ///   <summary>
        
///  右鍵內容區域
        
///   </summary>
        
///   <param name="sender"></param>
        
///   <param name="e"></param>
         private  void DataGridView1_CellMouseClick( object sender, DataGridViewCellMouseEventArgs e)
        {
             if (e.Button == MouseButtons.Right)
            {
                ShowMenu(DataGridView1, MenuRemove, e);
            }

        } 

代碼說明:

這樣就不要再設置DataGridView的ContextMenuStrip,自己來控制到底顯示哪個菜單和菜單的位置,如此可更加靈活顯示多個菜單。 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM