2012-06-22 35 views
2

我在運行時創建上下文菜單取決於datagridview的選定單元格中的文本。
像這樣:在運行時ContextMenuStrip事件處理程序

 With ContextMenuStrip1 
      .Items.Clear() 
      Dim Str As String = DataGridView1.Item(1, DataGridView1.CurrentRow.Index).Value 

      Dim strArr() As String = Str.Split(" ") 
      For count As Integer = 0 To strArr.Length - 1 
       If strArr(count).Length > 1 Then 
        .Items.Add(strArr(count)) 
       End If 
      Next 

      .Items.Add("-") 
      .Items.Add("Common operation ...") 
      .Items.Add("Second common operation ...") 
      AddHandler .Click, AddressOf cMenu_Click 

      .Show(New Point(Cursor.Position.X, Cursor.Position.Y)) 
     End With 
etc... 

然後,添加事件處理程序是這樣的:

Private Sub cMenu_Click(ByVal sender As Object, ByVal e As System.EventArgs) 
    Dim mytext As String 
    mytext = (CType(sender, ContextMenuStrip).Text) 
    Debug.Print(mytext) 

    'after all... 
    RemoveHandler ContextMenuStrip1.Click, AddressOf cMenu_Click 
End Sub 

此外,與此代碼,我不能在事件處理程序被解僱的菜單項的文本vbnet初學者。
所以請幫助獲取它。

回答

2

每個菜單項都需要處理程序。

嘗試這種方式(與添加一個快捷鍵更新):

For count As Integer = 0 To strArr.Length - 1 
    If strArr(count).Length > 1 Then 
    Dim newMenu As New ToolStripMenuItem(strArr(count), _ 
             Nothing, AddressOf cMenu_Click) 
    newMenu.ShortcutKeys = Keys.Control Or Keys.C 
    .Items.Add(newMenu) 
    End If 
Next 

您單擊的方式應改爲處理ToolStripMenuItem代替:

Private Sub cMenu_Click(ByVal sender As Object, ByVal e As EventArgs) 
    Dim mytext As String 
    mytext = DirectCast(sender, ToolStripMenuItem).Text 
    Debug.Print(mytext) 
End Sub 
+0

謝謝拉爾斯!這工作非常好!我應該在不再需要的情況下移除處理程序嗎?或者我不應該這樣做?如果我在這種情況下應該怎麼做? –

+0

@ user973238我不認爲這是必要的,因爲被清除的菜單項不存在於其他地方。沒有參考了。看到這個答案[在vb.net中,如果我使用AddHandler,我必須使用RemoveHandler嗎?](http://stackoverflow.com/a/7436068/719186) – LarsTech

+0

是的,我非常感謝,現在我明白了更好。 –

0

爲ContextMenuStrip的所有子項的Click事件添加一個處理程序(指向相同的方法)。然後在你的方法中將其轉換爲ToolStripMenuItem或MenuItem類(無論你使用什麼)來查找被單擊項目的文本。

+0

你能爲提供最小的代碼示例你的建議? –

相關問題