質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

4回答

8451閲覧

複数のコントロール名(連番)を動的に取得したい。

kariaka2020

総合スコア37

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

1クリップ

投稿2020/05/17 09:42

編集2020/05/19 22:28

VB.net初心者です。
複数のコントロール名(今回はラジオボタン)を順番に取得し、条件を満たしているかチェックしたいです。
初心者のため見当違いなことを書いていたらすみません。

#前提
フォームにラジオボタンが3つ配置してあります。
コントロール名(?)は次のように定義しています。
rdoSubject1,rdoSubject2,rdoSubject3

#実現したいこと
ラジオボタンがTrueとなっているのが、1なら、2なら...というようなCase文を書いています。

VB

1 2 Select Case True 3 4 Case Me.rdoSubject1.Checked 5 '処理 6 Case Me.rdoSubject2.Checked 7 '処理 8 Case Me.rdoSubject3.Checked 9 '処理 10 11End Select

このような処理(Case~)を一つ一つ書くと長くなってしまうので、数字の部分を変数に置き換えて、For Next文でまとめたいと考えました。

#試してみたこと
以前、GetObject("moon0" & n.ToString) のような形で画像(moon01~05という名前)を読み込めた記憶があったので似たようなことをしてみたのですが、「StringはCheckのメンバではありません」というようなエラーが出てしまいました。また、SelectCaseの中のFor文の中にCaseを置くことはできなさそうだったのでCaseではなくIf文になおしました。

.ToStringを消すと、「IntegerはCheckedのメンバーではありません」というエラーが出るので、.Checkedで使えるようにすればよいということなのでしょうか。。

VB

1 2For i = 1 To 3 3 If "Me.rdoKamoku" & i.ToString .Checked = True Then 4 '処理 5 End If 6Next i

よろしくお願いいたします。

#解決後
イベントハンドラを利用する場合は、tosiさんの回答と、以下のコードを組み合わせることで出来ました。

以下は関数として用意したもの。

VB.net

1Private Function Dainyu(pArrKijyun(,) As Integer) As Integer() 2 3 Dim Modori(2) As Integer '関数の戻り値 4 5 For i = 0 To 2 6 7 Dim rdoSTR As String = "rdoKamoku" & i + 1 'コントロール取得用の文字列 8 Dim rdo As Control = grpKamoku.Controls(rdoSTR) 'rdoKamokuはgrpKamokuという名前GroupBoxの上に置いているから 9 Dim aaa As RadioButton = CType(rdo, RadioButton) 10 11 If aaa.Checked = True Then 12 13 For j = 0 To 2 14 15 Modori(j) = pArrKijyun(i, j) 16 17 Next j 18 19 End If 20 21 Next i 22 Return New Integer() {Modori(0), Modori(1), Modori(2)} 23 24 End Function

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2020/05/17 09:49

チェックのついているコントロールによって処理内容が変化するのではないですか? そうなのであれば、結局そういった部分で分岐が入るだけだったりしませんか?
pepperleaf

2020/05/17 09:51

ラジオボタンの配列(リストでも良い)を作って、それで順にアクセスすれば、どうでしょう。VBはあまりやったことが無いので、参考までに。
kariaka2020

2020/05/17 10:03 編集

YAmaGNZ様 回答ありがとうございます。 処理内容についてはほとんど同じようなものにする予定です。 このままのコードでは動きませんが、配列にいれてある値を変数に入れていくというような処理がしたいのですが、あまりよくありませんでしょうか。。?(変数はkijyun1~3が存在します。) For i = 1 To 3 if "Me.rdoSubject" & i+1.ToString .Checked = True Then For j = 1 To 3 "kijyun" & j.ToString = ArrKijyun(i, j) Next j EndIf Next i
kariaka2020

2020/05/17 10:03

pepperleaf様 ラジオボタンの配列ですね、ありがとうございます。少し考えてみます。
gentaro

2020/05/17 10:24

直接的な回答じゃないですが、ビジュアルコントロールを「データの状態を保持するもの」という考え方を改めて、例えばラジオボタンならイベントハンドラでチェックの状態が変更されたら別のメンバーとして配列なりオブジェクトなりに状態を記録し、ループを回す場所ではそっちを参照する方が筋が良いんじゃないか、とは思いますが。
Zuishin

2020/05/17 10:25

ラジオボタンの CheckedChanged イベントをすべて同じイベントハンドラにし、CType(sender, RadioButton) で sender をラジオボタンにキャストし、その Checked が True の場合に処理を行えばいいと思います。
kariaka2020

2020/05/17 10:57

gentaro様、Zuishin様 回答ありがとうございます。 用語の意味も含めてひとつひとつ確認していきたいと思います。
pepperleaf

2020/05/17 11:21

Zuishinさん、 ラジオボタンのイベントを共通にする、やってました。忘れてた。確か、イベントの引数(sender)で、どのコントロールか分かるので、それ見てた。ついてでに、コントロールに対応するメソッドを定義する事で、そのまま、処理へ飛ばすと。
kariaka2020

2020/05/19 15:10

皆様のおかげで無事解決しました。 わかりにくい質問で申し訳ありません..! この度はありがとうございました。
guest

回答4

0

初心者向けの回答ではありません。Reactive Extensions というものがあることを紹介する参考情報です。

NuGet で System.Reactive をインストールすると、次のコードでチェックされたラジオボタンの名前をもとにフォームタイトルが変更されます。複雑なイベント処理を見通しよく記述するのに便利な方法ですが、この質問のような単純な処理の場合は普通にイベントハンドラを使うのが良いと思います。

また仮にこの方法で解決したとしても、自分で使いこなせないならすぐに破綻するため、使いこなせる方法を採用してください。

VB.NET

1Imports System.Reactive.Linq 2Imports System.Text.RegularExpressions 3 4Public Class Form1 5 6 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 7 8 Controls _ 9 .Cast(Of Control) _ ' LINQ で扱えるよう Form1.Controls を IEnumerable(Of Control) に変換 10 .ToObservable() _ ' それをさらに IObservable(Of Control) に変換 11 .Expand(Function(a) a.Controls.Cast(Of Control).ToObservable()) _ ' 子孫コントロールを再帰的に列挙 12 .OfType(Of RadioButton) _ ' その中から RadioButton のみ抽出 13 .SelectMany(Function(a) Observable.FromEventPattern(a, NameOf(a.CheckedChanged))) _ ' RadioButton.CheckedChanged イベントをストリームに変換 14 .Select(Function(a) CType(a.Sender, RadioButton)) _ ' ストリームから Sender を取り出し、イベントを発生させた RadioButton を抽出 15 .Where(Function(a) a.Checked) _ ' RadioButton がチェックされた場合のみ抽出 16 .Select(Function(a) Regex.Match(a.Name, "^(.+)(\d+)$")) _ ' チェックされた RadioButton の Name プロパティを末尾の数字とそれ以外に分ける 17 .Where(Function(a) a.Success) _ ' 分けることができたときのみ抽出 18 .Subscribe( 19 Sub(a) 20 Dim s As String = a.Groups(1).Value 21 Dim i As Integer = Integer.Parse(a.Groups(2).Value) 22 23 ' フォームタイトルを変更 24 Text = $"{s}({i})" 25 End Sub) 26 End Sub 27 28End Class

投稿2020/05/19 05:00

Zuishin

総合スコア28669

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kariaka2020

2020/05/19 12:26

Zuishin様 丁寧な回答誠にありがとうございます。 今の私には少し難しそうなので週末にゆっくり調べようと思います。
Zuishin

2020/05/19 12:35

これは調べなくていいですよ。それよりも、他の回答でわからないことがあればその回答者さんに詳しく聞いてみてください。 コントロール名をどのタイミングで取得したいのか、また取得してそれをどう使うのかがあいまいなので、ポイントが絞りにくいというのもあります。
kariaka2020

2020/05/19 15:14

Zuishin様 たくさんのアドバイス本当にありがとうございました。 今の私にCheckedChanged イベントをすべて同じイベントハンドラにするという処理は想像することもできなかったので、とても助かりました。 これからも経験を積んでいろいろなアプローチができる人間になりたいと思います。 この度はありがとうございました。
guest

0

イベントハンドラーで取得しては駄目でしょうか?
こんな感じです。
FORMのラジオボタンのプロパティのイベントから作成を開始して編集します。
'-----------------------------------

'---------------------- ' Test_Sample_Miniature '---------------------- Private Sub RadioButton_Enter(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles _ RadioButton1.Enter, _ RadioButton2.Enter, _ RadioButton3.Enter, _ RadioButton4.Enter Dim wkr As RadioButton = CType(sender, RadioButton) Debug.Print(wkr.Text) End Sub

'-----------------------------------

投稿2020/05/18 00:10

編集2020/05/22 00:12
tosi

総合スコア553

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YAmaGNZ

2020/05/18 00:22

Enterイベントですと、フォーカスを得た時にも発生しますので、ClickイベントやCheckedChangedイベントにて対応したほうがいいのではないでしょうか
tosi

2020/05/18 00:29

はい。 イベントは色々と数多くありますので、運用に合わせて選択して頂いて宜しいと思います
kariaka2020

2020/05/19 13:47

tosi様 返信が遅くなり申し訳ありません。 Enterイベントでの例を教えていただき誠にありがとうございます。 YAmaGNZ様の補足コメントより、CheckedChangedイベントを今回は使用してみようと思っています。 ラジオボタンのどれかがクリックされたとき(チェックが変わったとき)、送り元をラジオボタン型に変換してwkrという変数に入れることで、それがラジオボタンとしてチェックされた状態かどうかや、ラジオボタンに設定してあるテキストの取得ができるというところまでは理解できました。 私の基礎力がほぼ無くて非常に申し訳ないのですが、ラジオボタン型として受け取った後、ループなどによって、それがRadioButton1なのかRadioButton2なのかRadioButton3なのかを判断するにはどのような書き方をすればよいのでしょうか...。 今のところIf elseif ...をつなげたりSelectCase文での方法しか思いつけていません。 (理想としては、質問の「試してみたこと」のようにコントロール名の1文字を変えるだけでできるといいなと思ったのですが可能でしょうか。)
kariaka2020

2020/05/19 14:32

申し訳ありません。 後半部分の質問なのですが、別の方のアドバイスと組み合わせることで上手くできそうな気がしてきたのでまず自分で取り組んでみたいと思います。
YAmaGNZ

2020/05/22 00:13

Tagプロパティを利用できるかもしれません。 各RadioButtonのタグプロパティに返す値を設定しておけば、 イベント内でイベントが起きたRadioButtonのTagプロパティから値を取り出すことで、どのRadioButtonか判断する必要がなくなるかもしれません。
guest

0

別の方法ということで。

ラジオボタンの配列を定義しといて、コンストラクタでその配列をラジオボタンで初期化しておけば、
radioarray[なんたら].checked
でアクセスできますんで、簡単にループでいじれます

投稿2020/05/17 11:03

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kariaka2020

2020/05/17 12:01

早速の回答誠にありがとうございます。 アドバイスを参考に変更してみたのですが、なかなかうまくいきません。。 Private radioarray() As Control = {Me.Controls("rdoSubject1"), Me.Controls("rdoSubject2"), Me.Controls("rdoSubject3")}で定義をし、 If radioarray(0).Checked = True Then というように入れてみると、 「'Checked'は'Control'のメンバーではありません」とエラーが出てしまいます。 これは別のところに原因があるといいうことなのでしょうか。 また、上記のような定義をせず、コントロール名を文字列の結合のような形で表すことは可能なのでしょうか。 ”rdoSubject” と for文によるカウント変数iの"1" を合わせた rdoSubject1.Checked 重ねての質問で申し訳ありません。お時間があるときで構いませんので、ご回答いただけると幸いです。 よろしくお願いいたします。
y_waiwai

2020/05/17 12:07

Private radioarray() As RadioButton にするか、 Control のままでも、RadioButtonにキャストするか、でいけるんではないでしょうか
Zuishin

2020/05/17 12:21 編集

これならわざわざ Control にしなくても、Me.rdoSubject1 でいいんじゃないでしょうか。 YAmaGNZ さんがあのように書かれたのは、"rdoSubject" という文字列と数字を使って、名前で取得できるようにするためです。「これを応用してループで」って書かれてますよね?
kariaka2020

2020/05/19 15:19

y_waiwai様 夜分失礼いたします。 おかげさまでメインの質問とコメントによる質問どちらも理解することができました。 この度はアドバイスありがとうございました。
guest

0

ベストアンサー

VBNET

1Dim A As Control = Me.Controls("RadioButton1")

このように名前を指定してコントロールを取得することができます。
これを応用して、ループでRadioButton1~3を取得するようにすれば思っていることが出来るかと思います。

投稿2020/05/17 10:08

編集2020/05/17 10:13
YAmaGNZ

総合スコア10489

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kariaka2020

2020/05/17 12:01 編集

早速の回答誠にありがとうございます。 アドバイスを参考に変更してみたのですが、なかなかうまくいきません。。 Dim subject1 As Control = Me.Controls("rdoSubject1") で定義をし、 If subject1.Checked = True Then というように入れてみると、 「'Checked'は'Control'のメンバーではありません」とエラーが出てしまいます。 これは別のところに原因があるといいうことなのでしょうか。 また、上記のような定義をせず、コントロール名を文字列の結合のような形で表すことは可能なのでしょうか。 ”rdoSubject” と for文によるカウント変数iの"1" を合わせた "rdoSubject1" .Checked 重ねての質問で申し訳ありません。お時間があるときで構いませんので、ご回答いただけると幸いです。 よろしくお願いいたします。
YAmaGNZ

2020/05/17 12:27

なるべく型を意識するようにしてください。 Dim subject1 As Control このように書いたのであれば、subject1はControl型として扱われます。 例え代入したものがRadioButtonだったとしてもです。 このような場合は、RadioButton型の変数として宣言するかRadioButton型にキャストする必要があります。 次にControls("rdoSubject1")と引数として渡すのは文字列です。 ですので、その文字列をループ内で生成すればいいことになります。 ループ内で文字列を生成し、代入するようにしましょう。
Hey_CH

2020/05/17 16:25

ラジオボタンがPanel等のコントロール内にあることも想定した方が良いかもしれませんね。
YAmaGNZ

2020/05/17 22:03

そのようなコンテナ上に配置したという情報が出れば書くつもりでした。
kariaka2020

2020/05/19 14:37 編集

夜分に失礼いたします。 教えていただいたことを参考に以下のようなコードを書いてみたのですが、 コントロール取得のところでNothingが入ってしまいます。 一昨日、昨日と考えてみましたがどのように修正すべきかわかりませんでした。 もしよろしければどのように直すべきか教えていただけませんでしょうか。 Private Function Dainyu(pArrKijyun(,) As Integer) As Integer() Dim Modori(2) As Integer '関数の戻り値 For i = 0 To 2 Dim rdoSTR As String = "rdoSubject" & i + 1 'コントロール取得用の文字列 Dim rdo As Control = Me.Controls(rdoSTR) '②ここを確認するとNothingになってしまっている。 Dim aaa As RadioButton = CType(rdo, RadioButton) If aaa.Checked = True Then  '①エラーが出る箇所はここ For j = 0 To 2 Modori(j) = pArrKijyun(i, j) Next j End If Next i Return New Integer() {Modori(0), Modori(1), Modori(2)} End Function よろしくお願いいたします。
YAmaGNZ

2020/05/19 14:50

rdoSubject1~3はフォームに直接置いていますか?それともPanel等に置いていますか? もし、Panelに置いているのであれば、 Panel1.Controls(rdoSTR) といった感じでrdoSubject1等を置いたコンテナコントロールのControlsを探すようにしてください。
kariaka2020

2020/05/19 15:08

返信ありがとうございます。 Hey_CHさんが指摘されていたのはそういうことだったのですね。 今回はGroupBoxに配置していたのでGroupBox1.Controls(rdoSTR)とすることで正しく読み取ることができました。 この度は初心者である私のために、遅い時間にもかかわらず何度もアドバイスをくださいまして誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問