2017-05-28 71 views
1

編輯3:很明顯,RowTemplate.ContextMenuStrip不是爲任何理智的程序員設計的。除了下面描述的所有問題之外,爲每行生成的上下文菜單是原始的克隆 - 但僅限於的第一級。任何子菜單將在上下文菜單中出現而不是。顯然它也會導致memory leak。故事的寓意:千萬不要使用RowTemplate.ContextMenuStripDataGridViewRow的C#ContextMenuStrip:SourceControl的等價物是什麼?

所以我想我想通了「正確」的方式來顯示上下文菜單,當用戶在DataGridView的任何行權點擊,而不是當用戶在DataGridView內的空白處點擊:

Setting ContextMenuStrip for Row

通過設置DataGridViewRowTemplateContextMenuStrip財產,我可以很容易附上一個上下文菜單到每個DataGridView的行。但是,在顯示上下文菜單時,我需要知道哪個行右鍵單擊。通常情況下,知道上下文菜單來自何處的方法是使用ContextMenuStrip.SourceControl屬性,但在這種情況下,該屬性僅返回DataGridView,因爲顯然DataGridViewRow不是控件。那麼我怎麼知道哪一行是右鍵點擊?

編輯:我發現了分配上下文菜單時行這種方式,每一行實際上有一個克隆相同ContextMenuStrip。這意味着我們可以將ContextMenuStripTag屬性設置爲相應的DataGridViewRow。但是我不知道這是否是低效率的,如果這會導致其他看不見的問題。

編輯2:我認爲SourceControl屬性返回null,但那個是不正確 - 我被檢查原ContextMenuStripSourceControl屬性,這是打開ContextMenuStrip僅僅是一個克隆。

編輯3:查看問題的頂部。

+0

右鍵點擊的行不一定是選中的一個,對不對? –

+1

如果用戶沒有先選擇它,則不是。考慮處理[此代碼](https://stackoverflow.com/a/27702246/17034)以獲取右鍵單擊所選行並顯示cms。 –

回答

0

您使用「CellMouseEnter」。

{ 
     ... 
     dataGridView1.CellMouseEnter += new DataGridViewCellEventHandler(dataGridView1_CellMouseEnter); 
     menuItem1.Click += new System.EventHandler(this.menuItem1_Click); 
    } 

    void dataGridView1_CellMouseEnter(object sender, DataGridViewCellEventArgs e) 
    { 
     mPoint = dataGridView1.PointToClient(Cursor.Position); 
    } 

    private void menuItem1_Click(object sender, EventArgs e) 
    { 
     DataGridView.HitTestInfo hitTestInfo = dataGridView1.HitTest(mPoint.X, mPoint.Y); 

     Console.WriteLine(hitTestInfo.RowIndex + ", " + hitTestInfo.ColumnIndex); 
    } 
相關問題