プロパティをループで指定する方法はあるのか?

このQ&Aのポイント
  • VB.NETの環境で、あるクラスのプロパティをループで指定して利用する方法はありますか?例えば、40個のプロパティに対してループしてゲットやセットすることは可能ですか?
  • フォームなどのコントロールで、複数のコントロールへ同じ内容を入れ込む場合は、プロパティをループして同じ操作を行うことができますが、VB.NETの環境で同じようなことができるのか疑問です。
  • VB.NETの環境で、40個のプロパティに対してループを使用してアクセスする方法はありますか?プロパティの値を取得したり設定したりするための効率的な方法を教えてください。
回答を見る
  • ベストアンサー

プロパティをループで指定する

環境: WindowsXP VisualStudio2008 Professional 言語: VB.NET あるクラスのプロパティへ Public Property Prop1 As Integer/Prop2/Prop3/・・・・と設定し、ゲットやセットするのにループしていれる方法はあるのでしょうか。 例えば・・・ For I As Integer = 1 To 40   Console.WriteLine(Prop & I) Next 若しくは For Each Property As Property型??(Object??) In Properties??(プロパティコレクション??)   Console.WriteLine(Property.Value??) Next という感じです。 フォームなどのコントロールで、複数のコントロールへ同じ内容を入れ込むときに使ったことはあるのですが、プロパティでも同じことができるのかなと思い質問してみました。

質問者が選んだベストアンサー

  • ベストアンサー
  • OMEGAT
  • ベストアンサー率70% (455/642)
回答No.1

たとえば、Button1コントロールのプロパティとその値は、以下のような感じで表示できたと思います。 Dim pi As System.Reflection.PropertyInfo For Each pi In Me.Button1.GetType().GetProperties() MsgBox(pi.Name + "=" + pi.GetValue(Me.Button1, Nothing).ToString()) Next

buraigasho
質問者

お礼

ありがとうございます。 なるほど・・・GetTypeでGetPropertiesですね。 Riflectionをつかうのは知りませんでした。 まだまだ勉強不足ですね。。。 ヒントをいただいて色々と調べた結果以下でクラスのプロパティで設定した値を取得できました。 ※SampleControlClassを生成しているのは、元々取得したいプロパティが入っているSampleClassがオブジェクトを生成しないMustInheritとしているので、継承しているSampleControlClassをオブジェクト生成して入れ込んでます。 Dim SCClass As New SampleClassControl Dim ClsType As Type = GetType(SampleClass) Dim Prop() As PropertyInfo = ClsType.GetProperties For Each props As PropertyInfo In Prop   Console.WriteLine(CType(props.GetValue(SCClass, Nothing), Integer)) Next ちなみにセットもついでにできました。 For Each props As PropertyInfo In Prop   props.SetValue(SCClass, I, Nothing)   I += 1 Next 一応、期待通りにことは運んだんですが、他にもありますかね?

関連するQ&A

  • 配列

    エクセルvbaなのですが Sub test() ' 配列 Dim arr() As Integer= {0, 1, 2, 3, 4, 5} ' 抜き出した要素を格納するための変数 Dim i As Integer ' すべての要素について繰り返す For Each i In arr Console.WriteLine (i) Next End Sub これって何でエラーになるのでしょう? Dim arr() As Integer= {0, 1, 2, 3, 4, 5} でエラーになりますが、なぜだかわかりません。

  • Forループの制御について

    VB 2005,Framework2.0を使用しています。 For文を使ったループについてお尋ねしたいことがあります。 For i As Integer = 0 To 10     ’処理 Next i とあったとします。 そうするとループ変数iが0から10になるまで連続してループを行うのですが、これをある条件の時に現在のループ変数から一つ飛ばして次のループからまた処理を行いたい場合どのようにすれば良いのでしょうか? 例えば0~10回中に、現在5回目で特定の条件が一致したときその次の6回目のループは飛ばして7回目のループから再開したいです。 ちなみにこの様に書いても0から10回必ずループされてしまいました。 Dim TEST(10) As Integer TEST(5) = 1 For i As Integer = 0 To 10 If TEST(i) = 1 Then i = i + 1 End If Next i

  • コレクションの取り扱い

    宜しくお願いします。 下記のようなソースでクラスをコレクション化したのですが for each文で値が変わってくれません。(泣) 何か基本的な事だと思うのですが、お知恵を頂ければ幸いです。m(__)m 'emp Collection Public Class clsEmp Inherits System.Collections.ArrayList '色々とメソッドを追加予定・・・ End Class 'empの構造体 Public Structure emp Public ID As Integer Public name As String Public score As Integer Public Sub New(ByVal ID_ As Integer, ByVal name_ As String) Me.ID = ID_ Me.name = name_ Me.score = -1 End Sub End Structure 'モジュール 'empのCollectionを宣言 Private emps As New clsEmp Private Sub Form_Load(・・・) Dim i% 'とりあえず、インスタンスを作る For i = 0 To 10 emps.Add(New emp(i, "test" & i)) Next End Sub Private Sub Button3_Click(・・・) Dim emp_ As emp '初期化してみる For Each emp_ In emps Debug.WriteLine(emp_.name) emp_.score = 0 Next '確認用 For Each emp_ In emps Debug.WriteLine(emp_.score) Next End Sub

  • シート名をループに

    質問を簡単にする為に以下のマクロがあるとします。 シート名が1~31とあるのですが、これをfor loopで 使うにはinteger等の定義が違うのでしょうか。 Sub bbb() Dim ws As Worksheet Dim 曜日 As String Dim i As Integer For Each ws In Worksheets For i = 1 To 31 If ws.Name = i Then  <----------ここでエラー  (コマンド) End If Next i Next End Sub

  • ループ中にフォームを閉じると、様々な例外が出てしまう・・

    お世話になっております。 VB2005を勉強しております。現在、フォームが一枚だけのシンプルなプログラムを作っています。For~Nextのループ内にApplication.DoEvents()と記述して他の操作を受けられるようにしておりますが、その状態でループ中にフォームを閉じると例外が出てしまいます。それにフォームは消えまても、デバッグ中断ボタンを押すまでプログラム自体はは起動したままです。強制定期にループを破棄する方法をご教授ください。または、ループ中でも正常にプログラムを閉じる方法でも結構です。 ループ内の処理によってエラー内容は違いますが、現在はAccess.Violation.Exceptionという例外がでます。下記のように、なんの処理もしないループを作ってみましたが、やはりこれでも違う例外が出ました。 ・その1 For i As Integer = 0 To 1000000000   Application.DoEvents() Next ・その2 For i As Integer = 0 To 1000000000   Application.DoEvents()   System.Threading.Thread.Sleep(100) Next ちなみに、フォームのClosingイベントでフラグを立てて、 For i As Integer = 0 To maxInt   If flag_closing = True Then     Exit For   End If   Application.DoEvents() Next などとやってみましたが効果がありませんでした。 よろしくお願いいたします。

  • コントロールタイプを絞ってループしたい

    アクセスのフォーム上のコントロールをループする際に テキストボックスだけ絞ってループしたいのですが Sub Sample() Dim myFormName As String Dim ctl As Control myFormName = "フォーム1" For Each ctl In Forms(myFormName).Controls If ctl.ControlType = acTextBox Then End If Next ctl End Sub これだとテキストボックスの量が多くて、2秒くらいかかるのですが For Each ctl In Forms(myFormName).Controls この時点で、テキストボックスだけ絞る方法はありますか? For Each ctl In Forms(myFormName).ControlType(acTextBox) こうするとエラーになりました。 ご教授よろしくお願いします。

  • .NET1.1でPING処理(C#からの変換)

    VB2002+WIN2000を使用。 リモート端末へのアクセス前に起動確認処理としてPINGを使い、電源OFF時の待ち時間を減らしたいと考えています。 ○PINGの他に導通確認できる手軽なものがあるのでしたら教えてください。 PINGの処理はネットで検索した結果C#(1.1)のものでしたら発見できたため、それを利用しようと思っています。(サイトでもVBへの変換は簡単にできるとあったので^_^;) 自分なりに変換してみましたがエラーが発生してしまい原因/対応方が分かりません。 ぜひご教授下さい。よろしくお願いいたします。 (補足が必要であれば記述します。) 【元からの変更】 ・引数はなしにし、固定にしました。 ・Button1の処理に記述しました。 ・参照設定でSystem.Managementを追加しました。 【エラー】 スレッド '<名前がありません>' (0x59c) はコード 0 (0x0) で終了しました。 'System.Management.ManagementException' のハンドルされていない例外が system.management.dll で発生しました。 追加情報 : 無効なクラスです 【予想】 searcherにGetがない? 対策が分からず… ----- 変更プログラム ------ Imports System Imports System.Management Dim arg As String arg = "192.168.0.1" 'クエリ文字列の設定() Dim searcher As ManagementObjectSearcher = New ManagementObjectSearcher() searcher = New ManagementObjectSearcher("select * from Win32_PingStatus where address = '" & arg & "'") ' クエリ結果のとりだし Dim mo As ManagementObject 'エラー箇所 For Each mo In searcher.Get Dim i As Integer ' 結果のプロパティのチェックと状態の表示 If mo.Properties("StatusCode").Value = "" Or Convert.ToInt32(mo.Properties("StatusCode").Value) <> 0 Then Console.WriteLine(arg + ":稼働していません") Else Console.WriteLine(arg + ":稼働中") Console.WriteLine("IPAddress:" & mo.Properties("ProtocolAddress").Value) Console.WriteLine("ResponseTime:" & mo.Properties("ResponseTime").Value) End If Next Console.WriteLine("----------------") ------ 元プログラム(C#) ---------------------- using System; using System.Management; class PingExec { public static void Main(string[] args) { if(args.Length > 0) { foreach(string arg in args) { // クエリ文字列の設定 ManagementObjectSearcher searcher = new ManagementObjectSearcher( "select * from Win32_PingStatus where address = '" + arg + "'"); // クエリ結果のとりだし foreach( ManagementObject mo in searcher.Get() ) { // 結果のプロパティのチェックと状態の表示 if(mo.Properties["StatusCode"].Value == null || Convert.ToInt32(mo.Properties["StatusCode"].Value) != 0) { Console.WriteLine(arg + ":稼働していません"); } else { Console.WriteLine(arg + ":稼働中"); Console.WriteLine("IPAddress:" + mo.Properties["ProtocolAddress"].Value); Console.WriteLine("ResponseTime:" + mo.Properties["ResponseTime"].Value); } } Console.WriteLine("----------------"); } } } }

  • エクセル マクロ ループ処理の構文について

    お世話になります。エクセル初心者です。 i < j の関係があるときに、それぞれの数値をfor構文でループを回したいです。 i の数値は外部から入力される前提です。 現在、以下のような構文を考えています(istartとiendは外部から決められた数値とします)が、 この場合、jendはiend + 1とすれば良いのですが、jstartはどのように入力すれば良いでしょうか? 修正箇所を指摘(もしくは全文修正)していただけると、非常に助かります。 よろしくお願いいたします。 Sub test() Dim i As Integer Dim j As Integer Dim istart As Integer Dim iend As Integer Dim jstart As Integer Dim jend As Integer istart = 1 iend = 50 For i = istart To iend For j = jstart To jend '実行したい内容 Next Next End Sub

  • アクセスvba Pictureプロパティを空にする

    フォーム上の全てのコントロールのPictureプロパティを空にする という事をしたいのですが、 Pictureプロパティがないコントロールの場合はエラーになります。 (テキストボックスなど) Sub test() Dim myCtrl As Control Dim myForm As String Dim i As Long myForm = "フォーム1" DoCmd.OpenForm myForm, acDesign For Each myCtrl In Forms(myForm).Controls myCtrl.Picture = Empty Next End Sub Pictureプロパティがあるかどうかを取得したいのですが それってどうすればいいですか? それともOn Error Resume Next でエラーを無視するしかないでしょうか?

  • ipInfo.AddressListについて

    社内にあるパソコンの特定を行うためだけに使いますので サンプルのような、For Eachでまわす必要がない?のですが 社内にあるパソコン(クライアント限定でホスト名=1)と仮定した場合の 作りはどうしたらよいのでしょうか? '''Dim ipHostInfo As IPHostEntry = Dns.GetHostEntry("yahoo.co.jp") Dim ipHostInfo As IPHostEntry = Dns.GetHostEntry("192.168.0.102") For Each ipInfoAddress In ipInfo.AddressList Console.WriteLine(ipInfoAddress)    Exit For '←これで良いのでしょうか? Next また、For Eachする前に何個あるかわかる方法はありますか? 'サンプル ' ホスト名からIPアドレスを取得する Dim hostName As String = "dapc89" Dim ipInfo As IPHostEntry = Dns.GetHostEntry(hostName) Dim ipInfoAddress As IPAddress For Each ipInfoAddress In ipInfo.AddressList Console.WriteLine(ipInfoAddress) Next

専門家に質問してみよう