2016-06-08 38 views
2

我將單個上下文菜單附加到多個文本框。所以,我需要獲取用於顯示上下文菜單的控件名稱/引用。下面VB.Net獲取用於顯示上下文菜單條的控件

是我的上下文菜單中的樣本圖像:

enter image description here

下面是綠色的代碼標記爲「粘貼」項單擊事件:

Dim objTSMI As ToolStripMenuItem 
    Dim objCMS As ContextMenuStrip 
    Dim objTxtBox As System.Windows.Forms.TextBox 
    objTSMI = CType(sender, ToolStripMenuItem) 
    objCMS = CType(objTSMI.Owner, ContextMenuStrip) 
    objTxtBox = CType(objCMS.SourceControl, System.Windows.Forms.TextBox) 
    If Clipboard.ContainsText(TextDataFormat.Text) = True Then 
     objTxtBox.SelectedText = Clipboard.GetText(TextDataFormat.Text) 
    End If 

它工作得很好。

,但下面是我的紅色代碼標記爲「頁數」項單擊事件:

Dim objTSMI As ToolStripMenuItem 
    Dim objCMS As ContextMenuStrip 
    Dim objTxtBox As System.Windows.Forms.TextBox 
    objTSMI = CType(sender, ToolStripMenuItem) 
    objCMS = CType(objTSMI.Owner, ContextMenuStrip) 
    objTxtBox = CType(objCMS.SourceControl, System.Windows.Forms.TextBox) 
    MessageBox.Show(objTxtBox.Name) 

但上述拋出以下錯誤:

Unable to cast object of type 'System.Windows.Forms.ToolStripDropDownMenu' to type 'System.Windows.Forms.ContextMenuStrip'. 

這裏是錯誤的截圖:

enter image description here

所以,我無法弄清楚什麼是問題。

任何幫助,將不勝感激

+0

你不能只是釘在另一個'.Owner',因爲你知道這是一個嵌套的菜單嗎? – DonBoitnott

+0

請參閱此主題:http://stackoverflow.com/questions/12094528/contextmenustrip-owner-property-null-when-retrieving-from-nested-toolstripmenuit。我將在下面給出vb.net的答案,稍作改動。 –

回答

2

如果檢查this C# thread接受的答案指出這是一個錯誤。此處介紹的解決方法使用私有變量將SourceControl存儲在ContextMenuStripOpening事件中。我已轉換爲VB.NET並使用ContextMenuStripTag而不是使用該變量。然後,你指的是Tag屬性,而不是故障SourceControl屬性:

Imports System.ComponentModel 

Public Class Form1 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     Me.TextBox1.ContextMenuStrip = Me.ContextMenuStrip1 
     Me.TextBox2.ContextMenuStrip = Me.ContextMenuStrip1 
    End Sub 

    Private Sub ContextMenuStrip1_Opening(sender As Object, e As CancelEventArgs) Handles ContextMenuStrip1.Opening 
     Me.ContextMenuStrip1.Tag = CType(Me.ContextMenuStrip1.SourceControl, Control) 
    End Sub 

    Private Sub TestToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles TestToolStripMenuItem.Click 
     ' first level of context menu strip 
     Dim Strip As ContextMenuStrip = CType(sender, ToolStripMenuItem).Owner 
     Dim Box As TextBox = Strip.Tag 

     MessageBox.Show(Box.Name) 
    End Sub 

    Private Sub ChildToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles ChildToolStripMenuItem.Click 
     ' second level of context menu strip 
     Dim Strip As ContextMenuStrip = CType(sender, ToolStripMenuItem).OwnerItem.Owner 
     Dim Box As TextBox = Strip.Tag 

     MessageBox.Show(Box.Name) 
    End Sub 

End Class 
+0

不是一個錯誤,只是一個誤解。 SourceControl屬性返回導致上下文菜單打開的控件。如果它爲空,則不會導致上下文菜單打開。這將解決這個問題,但最好的辦法是編寫代碼,以便不需要這些信息。我使用了大量的上下文菜單,從不需要這個。 –

+0

@CodyGray http://stackoverflow.com/questions/37703891/how-to-get-parent-control-from-context-menu-item-vb-net 這是我的問題,我希望你看一看在我的情況下,並建議最新的其他可靠的方法來解決這個問題?而不使用羅賓的方法。 –

+0

您的問題沒有包含任何其他背景信息,可能會幫助我建議一種替代解決方案。沒有提及*爲什麼*你正試圖獲得這些信息,或者你將要用它做什麼。您只需顯示您的建議解決方案(使用'SourceControl'屬性),並顯示它爲什麼不起作用。哪一種方法可以提出問題,但只能爲您提供有限範圍的答案。通常情況下,上下文菜單違反了SRP,需要了解應用程序中另一個控件的詳細信息。 @ muh –