前言
繼續"不誤正業" - - #,記錄一下。有時候有這樣的需求: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( 0, 0));
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)));
}
{
if (e.Button == MouseButtons.Right)
{
Point point = DataGridView1.PointToScreen( new Point( 0, 0));
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( 0, 0));
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>
/// <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( 0, 0));
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);
}
/// 右鍵列頭
/// </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,自己來控制到底顯示哪個菜單和菜單的位置,如此可更加靈活顯示多個菜單。