一、使用屬性
DataGridView, DataGridViewColumn, DataGridViewRow, DataGridViewCell 有 ContextMenuStrip 屬性。可以通過設定 ContextMenuStrip 對象來控制 DataGridView 的右鍵菜單的顯示。 DataGridViewColumn 的 ContextMenuStrip 屬性設定了 除了列頭以外的單元格的右鍵菜單。 DataGridViewRow 的 ContextMenuStrip 屬性設定了除了行頭以外的單元格的右鍵菜單。DataGridViewCell 的 ContextMenuStrip 屬性設定了指定單元格的右鍵菜單。
[C#]
1
2
3
4
5
6
7
8
9
10
|
//
DataGridView 的 ContextMenuStrip 設定 DataGridView1.ContextMenuStrip
= this .ContextMenuStrip1;
//
列的 ContextMenuStrip 設定 DataGridView1.Columns[0].ContextMenuStrip
= this .ContextMenuStrip2;
//
列頭的 ContextMenuStrip 設定 DataGridView1.Columns[0].HeaderCell.ContextMenuStrip
= this .ContextMenuStrip2;
//
行的 ContextMenuStrip 設定 DataGridView1.Rows[0].ContextMenuStrip
= this .ContextMenuStrip3;
//
單元格的 ContextMenuStrip 設定 DataGridView1[0,
0].ContextMenuStrip = this .ContextMenuStrip4; |
對於單元格上的右鍵菜單的設定,優先順序是: Cell > Row > Column > DataGridView
二、使用dataGridView的 CellContextMenuStripNeeded、RowContextMenuStripNeeded 事件
利用 CellContextMenuStripNeeded 事件可以設定單元格的右鍵菜單,尤其但需要右鍵菜單根據單元格值的變化而變化的時候(例如你需要判斷cell的值大於10時使用ContextMenuStrip1,小於10時使用ContextMenuStrip2 ,那就需要用CellContextMenuStripNeeded事件來設置了)。比起使用循環遍歷,使用該事件來設定右鍵菜單的效率更高。但是,在DataGridView使用了DataSource綁定而且是VirtualMode的時候,該事件將不被引發。
[C#]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
//
CellContextMenuStripNeeded事件處理方法 private void DataGridView1_CellContextMenuStripNeeded( object sender,
DataGridViewCellContextMenuStripNeededEventArgs
e) {
DataGridView
dgv = (DataGridView)sender; if (e.RowIndex
< 0) {
//
列頭的ContextMenuStrip設定 e.ContextMenuStrip
= this .ContextMenuStrip1;
}
else if (e.ColumnIndex
< 0) {
//
行頭的ContextMenuStrip設定 e.ContextMenuStrip
= this .ContextMenuStrip2;
}
else if (dgv[e.ColumnIndex,
e.RowIndex].Value is int )
{
//
如果單元格值是整數時 e.ContextMenuStrip
= this .ContextMenuStrip3;
}
} |
同樣,可以通過 RowContextMenuStripNeeded 事件來設定行的右鍵菜單。
[C#]
1
2
3
4
5
6
7
8
9
10
11
12
13
|
//
RowContextMenuStripNeeded事件處理方法 private void DataGridView1_RowContextMenuStripNeeded( object sender,
DataGridViewRowContextMenuStripNeededEventArgs
e) {
DataGridView
dgv = (DataGridView)sender; //
當"Column1"列是Bool型且爲True時、設定其的ContextMenuStrip object boolVal
= dgv[ "Column1" ,
e.RowIndex].Value; Console.WriteLine(boolVal);
if (boolVal
is bool &&
( bool )boolVal)
{
e.ContextMenuStrip
= this .ContextMenuStrip1;
}
} |
CellContextMenuStripNeeded 事件處理方法的參數中「e.ColumnIndex=-1」表示行頭、「e.RowIndex=-1」表示列頭。RowContextMenuStripNeeded則不存在「e.RowIndex=-1」的情況。
————————————————————分割線——————————————————————————————
1、上面只是設置ContextMenuStrip的方法,右鍵並不會改變當前的行號,也就是說:當前行號是1,但右鍵單擊第2行,彈出ContextMenuStrip菜單,這時當前行依然是第1行,currentRow取得的數據也是第1行的數據,那麼我們怎麼使右鍵的同時改變當前行號呢?
可以使用CellMouseDown事件解決這一問題:
private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
if (e.RowIndex >= 0)
{
dataGridView1.ClearSelection();
dataGridView1.Rows[e.RowIndex].Selected = true;
dataGridView1.CurrentCell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];
//contextMenuStrip_ListViewItemRightClick.Show(MousePosition.X, MousePosition.Y);
}
}
}
——————————————————再分割——————————————————————————————
對於treeview也有類似的問題,解決方法:
//對於treeview可以應用mousedown事務
辦法一:
1
2
3
4
5
6
7
8
9
10
11
|
private void treeView1_MouseDown( object sender,
MouseEventArgs e) {
if (e.Button
== MouseButtons.Right) {
TreeNode
node = this .treeView1.GetNodeAt(e.Location);
if (node
!= null )
{
this .treeView1.SelectedNode
= node; }
}
} |
辦法二:
1
2
3
4
5
6
7
8
9
10
|
void jcsTreeView1_MouseDown( object sender,
MouseEventArgs e) { System.Windows.Forms.TreeViewHitTestInfo
hittestinfo = this .jcsTreeView1.HitTest(e.X
,e.Y); if (hittestinfo.Node
!= null ) { TreeViewHitTestLocations
loc = hittestinfo.Location; if (loc
== TreeViewHitTestLocations.Label ) MessageBox.Show(hittestinfo.Node.Text); } } |