2016-08-25 29 views
0

我創建上下文菜單dinamically並希望將菜單項分配給我自己的函數(帶參數)。不幸的是,不要按我的意願去。使用自定義函數dinamically添加context_menu項目

以下示例說明了我想要做的事情。

Private Sub dgv_sub_CellMouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles dgv_sub.CellMouseUp 

    If e.Button = Windows.Forms.MouseButtons.Right Then 
     dgv_sub.Rows(e.RowIndex).Selected = True 
     context_sub.Items.Clear() 
     context_sub.Items.Add("Delete row " + dgv_sub.CurrentRow.Index.ToString, Nothing) AddressOf delRow(dgv_sub.CurrentRow.Index)) 
     context_sub.Items.Add("Delete all rows", Nothing) , AddressOf delRow(-1)) 
     context_sub.Show(New Point(Cursor.Position.X, Cursor.Position.Y)) 
    End If 
End Sub 

Private Sub delRow(ByVal rowtodelete As Integer) 

End Sub 

如何正確設置並使其按照所述的方式工作?

+0

你非常接近但是我不確定你是否真的需要這是動態的。你可以在之前添加這兩個項目並添加一個單擊事件,然後在'MouseDown'中設置你想要的可見性。讓我知道如果這沒有幫助 –

+0

嗨基思。這裏還有其他未描述的功能,因爲在這個上下文菜單下的情況可能會有很大的不同。在這個例子中,我展示了足以描述我的需求的簡化版本。 – user1697111

+0

好吧,我明白了,我會在幾分鐘後發佈我的答案:) –

回答

1

這是怎麼我通常做這幾樣東西:

  1. 有一個預先填充ContextMenu

  2. 分配ContextMenuDataGridView

  3. 添加活動的每一個ToolStripMenuItem

  4. 在每一個事件中,首先我做一檢查,以確保該行已選定

If dgv_sub.SelectedRows.Count > 0 Then

然後,我通過使用

SelectedRows(0)

得到正確的行
  • 爲了使事情更加簡潔,您還可以使用DataGridView.MouseDown事件來確保當用戶右鍵單擊一行時,它將被選中。

    Private Sub dgv_sub_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles dgv_sub.MouseDown 
        If e.Button = Windows.Forms.MouseButtons.Right Then 
         Dim hitTest As DataGridView.HitTestInfo 
         hitTest = dgv_sub.HitTest(e.X, e.Y) 
    
         If hitTest IsNot Nothing AndAlso hitTest.RowIndex > -1 Then 
          dgv_sub.CurrentCell = dgv_sub.Item(hitTest.ColumnIndex, hitTest.RowIndex) 
          dgv_sub.Rows(hitTest.RowIndex).Selected = True 
         End If 
        End If 
    End Sub 
    

  • ,因爲你需要的環境項是動態的,你將不得不在MouseDown事件藏漢做這些。

    爲了正確地添加一個項目,你仍然需要一個正常的單擊事件:

    context_sub.Items.Add("Name of Item", Nothing, AddressOf item_Click) 
    

    然後添加一個Sub這樣的:

    Private Sub item_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) 
        'Add any logic here, you can still use the dgv_sub.SelectedRows here 
    End Sub 
    

    理想情況下,你的每一個上下文菜單中創建一個不同的Sub你需要添加的項目

    +0

    謝謝基思,這是非常廣泛的答案。仍然...我怎麼知道在item_Click下哪個menuitem調用它?這是問題的重要部分。 – user1697111

    +0

    您可以使用sender參數。因此,如果您將'sender'強制轉換爲'ToolStripMenuItem',您就可以確切地知道是誰調用了它:Dim menu as ToolStripMenuItem = Ctype(sender,ToolStripMenuItem)' –

    +0

    再次感謝。這非常有用。我會在你的答案幫助下工作。 – user1697111

    相關問題