C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ContextMenuStripでチェックマークを付ける

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■91968 / inTopicNo.1)  ContextMenuStripでチェックマークを付ける
  
□投稿者/ CCCO2 (1回)-(2019/08/15(Thu) 11:37:06)

分類:[.NET 全般] 

ContextMenuStripでトグル式のV字のチェックマークを付けたいのですが
(複数項目があり、一つにチェックを入れると他のチェックを外れるラジオボタンタイプのもの)

https://dobon.net/vb/dotnet/control/menuradiocheck.html

このサイトでは、
ToolStripMenuItem.CheckStateプロパティをCheckedにすると良い
と書かれてあります。

しかし
ToolStripMenuItem.CheckStateプロパティ
というものが見当たりませんがどこにありますか?

また、トグルでチェックマークを付けたいのですが

以下のようなコードを試してみても
ContextMenuStripとToolStripMenuに互換性がないようで
うまくいきません。

どのようにすれば良いでしょうか?



    Private Sub ContextMenuStrip1_Click(sender As Object, e As EventArgs) _
        Handles ContextMenuStrip1.Click
        Dim item As ToolStripMenuItem = DirectCast(sender, ToolStripMenuItem)
        'チェック状態を反転させる
        item.Checked = Not item.Checked
    End Sub


    'ToolStripMenuItem1のClickイベントハンドラ
    Private Sub ToolStripMenuItem1_Click(sender As Object, e As EventArgs) Handles ContextMenuStrip1.Click
        'グループのToolStripMenuItemを配列にしておく
        Dim groupMenuItems As ToolStripMenuItem() = New ToolStripMenuItem() {Me.ContextMenuStrip1}

        'グループのToolStripMenuItemを列挙する
        For Each item As ToolStripMenuItem In groupMenuItems
            If Object.ReferenceEquals(item, sender) Then
                'ClickされたToolStripMenuItemならば、Indeterminateにする
                item.CheckState = CheckState.Indeterminate
            Else
                'ClickされたToolStripMenuItemでなければ、Uncheckedにする
                item.CheckState = CheckState.Unchecked
            End If
        Next
    End Sub

引用返信 編集キー/
■91970 / inTopicNo.2)  Re[1]: ContextMenuStripでチェックマークを付ける
□投稿者/ WebSurfer (1871回)-(2019/08/15(Thu) 11:58:10)
No91968 (CCCO2 さん) に返信

利用規約(抜粋)

一貫して同じハンドルを使用し、場を混乱させないようにしましょう。同じハンドルの方が
質問の背景がわかりやすいです (自作自演をしたり別人を装うのは回答者の善意を裏切る
行為です)。
引用返信 編集キー/
■91971 / inTopicNo.3)  Re[2]: ContextMenuStripでチェックマークを付ける
□投稿者/ Hongliang (862回)-(2019/08/15(Thu) 13:34:34)
ContextMenuStripは、右クリックで表示される板全体を指します。
それに対しToolStripMenuItemは、板に乗っている1行を指します。

ContextMenuStripはItemsプロパティで配下のToolStripMenuItemを管理し、
ToolStripMenuItemからはOwnerプロパティで自分が乗っているContextMenuStripにアクセスできます。
ただし継承関係の都合上、ContextMenuStrip::ItemsはToolStripItemのコレクションであり、ToolStripMenuItem::OwnerはToolStripになりますので場合によってはキャストの必要があります。

一般にはクリックイベントはToolStripMenuItemの方で扱います。
考え方的には、
・自分(sender)のOwnerのItemsを列挙し、
・それが自分であるかどうかでCheckStateを変更する
という処理になります。
引用返信 編集キー/
■91975 / inTopicNo.4)  Re[3]: ContextMenuStripで
□投稿者/ CCCO2 (2回)-(2019/08/15(Thu) 17:56:41)
2019/08/15(Thu) 17:59:20 編集(投稿者)

> 利用規約(抜粋)

引用返信 編集キー/
■91976 / inTopicNo.5)  Re[4]: ContextMenuStripで
□投稿者/ CCCO2 (3回)-(2019/08/15(Thu) 18:06:44)
> 利用規約(抜粋)

> 一貫して同じハンドルを使用し、場を混乱させないようにしましょう。同じハンドルの方が
> 質問の背景がわかりやすいです (自作自演をしたり別人を装うのは回答者の善意を裏切る
> 行為です)。

すいません、次から気をつけます

> 一般にはクリックイベントはToolStripMenuItemの方で扱います。
> 考え方的には、
> ・自分(sender)のOwnerのItemsを列挙し、
> ・それが自分であるかどうかでCheckStateを変更する
> という処理になります。

    Private Sub ContextMenuStrip1_Click(sender As Object, e As EventArgs) Handles ContextMenuStrip1.ItemClicked
        Dim item As ToolStripMenuItem = DirectCast(sender, ToolStripMenuItem)
        'チェック状態を反転させる
        item.Checked = Not item.Checked
    End Sub

こんな感じでしょうか?
やはりキャストできないというエラーが出てしまうのですが



引用返信 編集キー/
■91977 / inTopicNo.6)  Re[5]: ContextMenuStripで
□投稿者/ Hongliang (863回)-(2019/08/15(Thu) 18:12:52)
>>一般にはクリックイベントはToolStripMenuItemの方で扱います。
と言っているのに
> Private Sub ContextMenuStrip1_Click(sender As Object, e As EventArgs) Handles ContextMenuStrip1.ItemClicked
なぜContextMenuStrip?

Addするときに第3引数でEventHandlerを渡しますよね。
そのEventHandlerの処理で、checkStateを変更するコードも記述すればいいんじゃないでしょうか。
引用返信 編集キー/
■91978 / inTopicNo.7)  Re[6]: ContextMenuStripで
□投稿者/ CCCO2 (4回)-(2019/08/15(Thu) 18:48:18)

Private Sub test2(ByVal sender As System.Object, ByVal e As EventArgs)

For Each s As ToolStripItem In CType(sender, ToolStripItem).Owner.Items

s.CheckState = True

Next s

End Sub

こういうことですか?
'CheckState' は 'ToolStripItem' のメンバーではありません。

というエラーが出てしまうのですが。
引用返信 編集キー/
■91980 / inTopicNo.8)  Re[7]: ContextMenuStripで
□投稿者/ 魔界の仮面弁士 (2306回)-(2019/08/15(Thu) 20:14:16)
No91978 (CCCO2 さん) に返信
> s.CheckState = True

ひとまず、コンパイルを通すだけならば、

For Each s As ToolStripItem In CType(sender, ToolStripItem).Owner.Items
 s.CheckState = True
Next

ではなく、

For Each s As ToolStripItem In CType(sender, ToolStripItem).Owner.Items
 Dim m = TryCast(s, ToolStripMenuItem)
 If m IsNot Nothing Then
  m.CheckState = True
 End If
Next

であるとか、

For Each s In CType(sender, ToolStripItem).Owner.Items.OfType(Of ToolStripMenuItem)()
 s.CheckState = True
Next

などと書くことができそうです。



> 'CheckState' は 'ToolStripItem' のメンバーではありません。
> というエラーが出てしまうのですが。

変数 s の中身が ToolStripMenuItem だったとしても、
変数 s のデータ型が ToolStripItem 型であるのならば、
そのようなエラーになるでしょう。


ToolStripMenuItem 型は ToolStripItem 型を継承していますが、
ToolStripItem には CheckState プロパティはありませんよね?
ToolStripMenuItem には CheckState プロパティがありますけれども。


エラーの理由としては、下記と同じようなものです。

Dim x As Integer = ListBox1.SelectedIndex 'これは OK
Dim o1 As ListControl = ListBox1
Dim y As Integer = o1.SelectedIndex 'これは OK
Dim o2 As Control = ListBox1
Dim z As Integer = o2.SelectedIndex 'エラー:'SelectedIndex' は 'Control' のメンバーではありません。
引用返信 編集キー/
■91981 / inTopicNo.9)  Re[8]: ContextMenuStripで
□投稿者/ CCCO2 (6回)-(2019/08/15(Thu) 20:26:14)
ありがとうございます。


    Private Sub test2(ByVal sender As System.Object, ByVal e As EventArgs)


        For Each s As ToolStripMenuItem In CType(sender, ToolStripItem).Owner.Items

            If s IsNot Nothing Then

                s.CheckState = CheckState.Unchecked

            End If

        Next

        Dim item As ToolStripMenuItem = DirectCast(sender, ToolStripMenuItem)
        'チェック状態を反転させる
        item.Checked = Not item.Checked

    End Sub

これでできました。
なんか冗長的な気もしますが
こんなもんでしょうか?

引用返信 編集キー/
■91982 / inTopicNo.10)  Re[9]: ContextMenuStripで
□投稿者/ CCCO2 (8回)-(2019/08/15(Thu) 20:38:45)
これなら良さそうです
どうもありがとうございました


        Dim item As ToolStripMenuItem = DirectCast(sender, ToolStripMenuItem)

        For Each s As ToolStripMenuItem In CType(sender, ToolStripItem).Owner.Items

            If s IsNot Nothing AndAlso s IsNot item Then

                s.CheckState = CheckState.Unchecked

            Else

                s.CheckState = CheckState.Checked

            End If

        Next

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ