none
メニューのコントロール名を取得するには? RRS feed

  • 質問

  • 以下のようにやると「指定されたキャストは有効ではありません」という実行エラーとなり困っています。
    ボタンコントロールではこの方法でうまくできるのですが…。
    また、「Control」を「MenuItem」にし、「Name」を「Text」に変えればメニュー名は取得できるのですが…。
    どうやればいいのでしょうか?

    Private Sub MenuClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuメニューA.Click, mnuメニューB.Click, mnuメニューC.Click
       Dim sメニュー名 As String = CStr(CType(sender, Control).Name)
       Select Case sメニュー名
          Case "mnuメニューA"
          Case "mnuメニューB"
          Case "mnuメニューC"
       End Select
    End Sub

    2017年7月13日 5:40

回答

  • .Net 1.1だとやれることが少ない・・・

    Private Sub MenuClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuメニューA.Click, mnuメニューB.Click, mnuメニューC.Click
        Dim mi As MenuItem = CType(sender, MenuItem)
    
        If mi Is mnuメニューA Then
            MessageBox.Show(mnuメニューA.Text)
        ElseIf mi Is mnuメニューB Then
            MessageBox.Show(mnuメニューB.Text)
        ElseIf mi Is mnuメニューC Then
            MessageBox.Show(mnuメニューC.Text)
        End If
    
        'selectでやりたい場合のやりかた
        'Select Case True
        '    Case mi Is mnuメニューA
        '        MessageBox.Show(mnuメニューA.Text)
        '    Case mi Is mnuメニューB
        '        MessageBox.Show(mnuメニューB.Text)
        '    Case mi Is mnuメニューC
        '        MessageBox.Show(mnuメニューC.Text)
        'End Select
    End Sub

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2017年7月13日 9:32

すべての返信

  • こんにちは。

    MenuItemはControlを継承していないので実行エラーになっているのだと思います。

    https://msdn.microsoft.com/en-us/library/system.windows.forms.menuitem(v=vs.110).aspx
    https://msdn.microsoft.com/en-us/library/system.windows.forms.control(v=vs.110).aspx

    > また、「Control」を「MenuItem」にし、「Name」を「Text」に変えればメニュー名は取得できるのですが…。

    これは何が問題なのですか?

    2017年7月13日 7:55
    モデレータ
  • メニュー名は変わる場合があるので、コントロール名で判別したいのです。
    2017年7月13日 8:03
  • > また、「Control」を「MenuItem」にし、「Name」を「Text」に変えれば

    実行環境が今ないのですが、
    Control を MenuItem にし、Nameはそのままでは使えないのでしたっけ。

    MSDN見た感じだと取れそうですが、違う値が入ってきますか?

    2017年7月13日 8:18
    モデレータ
  • NameはMenuItemのメンバーではありません。というコンパイルエラーになります。
    2017年7月13日 8:32
  • すみません、根本的に勘違いしていたかもしれません。

    WindowsFormだと思い込んでました。
    どの環境で作成していますか?

    またMenuItemの生成部分を提示できますでしょうか。

    2017年7月13日 8:41
    モデレータ
  • VS2003 VisualBasic.Netです。
    2017年7月13日 8:51
  • .Net 1.1だとやれることが少ない・・・

    Private Sub MenuClick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles mnuメニューA.Click, mnuメニューB.Click, mnuメニューC.Click
        Dim mi As MenuItem = CType(sender, MenuItem)
    
        If mi Is mnuメニューA Then
            MessageBox.Show(mnuメニューA.Text)
        ElseIf mi Is mnuメニューB Then
            MessageBox.Show(mnuメニューB.Text)
        ElseIf mi Is mnuメニューC Then
            MessageBox.Show(mnuメニューC.Text)
        End If
    
        'selectでやりたい場合のやりかた
        'Select Case True
        '    Case mi Is mnuメニューA
        '        MessageBox.Show(mnuメニューA.Text)
        '    Case mi Is mnuメニューB
        '        MessageBox.Show(mnuメニューB.Text)
        '    Case mi Is mnuメニューC
        '        MessageBox.Show(mnuメニューC.Text)
        'End Select
    End Sub

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    2017年7月13日 9:32
  • この方法で実装しました。
    ありがとうございました。
    2017年7月18日 2:56