編輯3:很明顯,RowTemplate.ContextMenuStrip
不是爲任何理智的程序員設計的。除了下面描述的所有問題之外,爲每行生成的上下文菜單是原始的克隆 - 但僅限於的第一級。任何子菜單將在上下文菜單中出現而不是。顯然它也會導致memory leak。故事的寓意:千萬不要使用RowTemplate.ContextMenuStrip
。DataGridViewRow的C#ContextMenuStrip:SourceControl的等價物是什麼?
所以我想我想通了「正確」的方式來顯示上下文菜單,當用戶在DataGridView
的任何行權點擊,而不是當用戶在DataGridView
內的空白處點擊:
通過設置DataGridView
的RowTemplate
的ContextMenuStrip
財產,我可以很容易附上一個上下文菜單到每個DataGridView
的行。但是,在顯示上下文菜單時,我需要知道哪個行右鍵單擊。通常情況下,知道上下文菜單來自何處的方法是使用ContextMenuStrip.SourceControl
屬性,但在這種情況下,該屬性僅返回DataGridView
,因爲顯然DataGridViewRow
不是控件。那麼我怎麼知道哪一行是右鍵點擊?
編輯:我發現了分配上下文菜單時行這種方式,每一行實際上有一個克隆相同ContextMenuStrip
的。這意味着我們可以將ContextMenuStrip
的Tag
屬性設置爲相應的DataGridViewRow
。但是我不知道這是否是低效率的,如果這會導致其他看不見的問題。
編輯2:我認爲SourceControl
屬性返回null,但那個是不正確 - 我被檢查原ContextMenuStrip
的SourceControl
屬性,這是打開ContextMenuStrip
僅僅是一個克隆。
編輯3:查看問題的頂部。
右鍵點擊的行不一定是選中的一個,對不對? –
如果用戶沒有先選擇它,則不是。考慮處理[此代碼](https://stackoverflow.com/a/27702246/17034)以獲取右鍵單擊所選行並顯示cms。 –