[轉]DataGridView 的右鍵菜單(ContextMenuStrip)


一、使用屬性

DataGridView, DataGridViewColumn, DataGridViewRow, DataGridViewCell 有 ContextMenuStrip 屬性。可以通過設定 ContextMenuStrip 對象來控制 DataGridView 的右鍵菜單的顯示。 DataGridViewColumn 的 ContextMenuStrip 屬性設定了 除了列頭以外的單元格的右鍵菜單。 DataGridViewRow 的 ContextMenuStrip 屬性設定了除了行頭以外的單元格的右鍵菜單。DataGridViewCell 的  ContextMenuStrip 屬性設定了指定單元格的右鍵菜單。

 

[C#]

// 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#]

// 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#]

// 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);
               }
            }
        }

 

2、如果我們不需要根據單元格的值來區別設置不同的ContextMenuStrip,那么使用RowTemplate的ContextMenuStrip屬性設置ContextMenuStrip就足夠了。

 

——————————————————再分割——————————————————————————————

對於treeview也有類似的問題,解決方法:

 

//對於treeview可以應用mousedown事務

辦法一:

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; 
} 
} 
}

辦法二:

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);
           }
        }


免責聲明!

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



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