芸人が音声解説 「オレたちの甲子園」

C#でフォームのオブジェクトを変数名で指定するにはどうしたらよいでしょうか?

例えば、フォームにラジオボタンrdo0~rdo9と、
それぞれに対応するテキストボックスtxt0~txt9が用意されている状態で、
rdo1がチェックされていたらtxt1に"OK"と表示、
rdo2がチェックされていたらtxt2に"OK"と表示・・・
といったことをfor文で実現する場合どのようにしたらよいでしょうか?
変数をオブジェクト名として認識させるための方法がわかりません。

どなたかご教授願います。


*********************************************
for(int i=0;i<10;i++)
{
 rdoname = "rdo" + i;
 txtname = "txt" + i;

 if((何らかの処理?)(rdoname).checked)
  (何らかの処理?)(txtname).txt = "OK";
}

****************************************
↑この、オブジェクトとして認識する為の「何らかの処理」部がわかりません。

A 回答 (1件)

    • good
    • 0
この回答へのお礼

ありがとうございます。
大変助かりました!

お礼日時:2009/12/21 16:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q配列を使わずに、変数名を動的にループで回したい

配列を使わずに、変数名を動的にループで回したい

大学の課題をやっている途中に思ったことなのですが……。
プログラム中に同じ型の変数p1,p2,p3があり、それぞれの変数にループで同じ処理を施したいと思っています。
しかし、「p(i)」や「("p" + i)」などと、変数どうしを別のものとして認識させようとしても、コンパイラから警告が出て上手くいきません。

配列を使えば、このような処理が出来ることはわかるのですが、使う変数名を指定されてしまっているために、今回は配列を使えません。
出来るか出来ないか、出来る場合は方法を知りたいです。

後、今回はC言語のプログラムで利用出来るかが自分にとっての問題なのですが、C言語以外のこのプログラミング言語なら出来る、とかの情報もこの機会に知りたいです。
お答え出来る範囲でいいので、もしよければ回答お願いします。

Aベストアンサー

変数名を動的に変更するのは難しいでしょう
ポインタ配列を使って 実際に操作される変数と コード上で使用している変数を偽装することは可能ですよ

たとえば
int p1, p2, p3 , i;
int* pp[] = { &1p, &p2, &p3 };
としておけば
*pp[0] で p1を操作可能ですよ

for( i = 0; i < 3; i** ) {
  *pp[i] = i * 3;
}
などと操作すれば
p1,p2,p3に 0,3,6が代入されます

QC#で動的にコントロールを取得するにはどのようにしたらよいのでしょうか

C#で動的にコントロールを取得するにはどのようにしたらよいのでしょうか?

C#2008ですが、Form1にTextBoxが30個あって、textBox1~textBox30という名前がついています。
このテキストボックスの値をForm2で取得したいのですがなかなかうまくいきません。

-------------------------
Form2:
private void Form2_Click(object sender, EventArgs e){
 Form1 fm = new Form1();
 
 int No = 15; //ここを1~30まで動的にしたい
 string result = fm.textBox15.Text; //直接comboBox_type15と書くのではなく「"comboBox_type" + No.ToString()」のようにしたい
 MessageBox.Show(result);
}
-------------------------

コントロールを配列にして

Control[] ctlArray = new Control[30] { fm.textBox1, fm.textBox2, …, fm.textBox30 };

のようにしてみましたが、エラーになってしまいます。
いろいろネットで検索してみたのですが、「コントロール名を動的に文字列で作成して使う」という方法がどこにも載っていなく、数時間格闘しています。
すみませんがご教授願います。よろしくお願いいたします。

C#で動的にコントロールを取得するにはどのようにしたらよいのでしょうか?

C#2008ですが、Form1にTextBoxが30個あって、textBox1~textBox30という名前がついています。
このテキストボックスの値をForm2で取得したいのですがなかなかうまくいきません。

-------------------------
Form2:
private void Form2_Click(object sender, EventArgs e){
 Form1 fm = new Form1();
 
 int No = 15; //ここを1~30まで動的にしたい
 string result = fm.textBox15.Text; //直接comboBox_type15と書くのではなく...続きを読む

Aベストアンサー

どう回答したものかとかなり悩みました。
いろいろな考え方があるので。。。

コンストラクタのオーバーロードで自分自分を渡すという
suffreさんの方法もなるほどーと思いました。
「あり」だと思います。

他に方法がいくつかあります。
2つだけ紹介します。

ひとつは、
fm.ShowDialog(this);
と、Owner指定なるものを使って、自分を渡す方法です。
これが一番楽かな、と思っています。
渡されたForm2の方では、
this.OwnerをForm1でキャストすれば、
suffreさんの方法と同じようにForm1のPublicのメンバに
アクセスできます。
例えば、
((Form1)this.Owner).textBox3.Text = "hoge";
です。
オーバーロードとか書かなくていいのでその点簡単でしょう。

もう一つは、Form2の側にPublicなメンバ(特にプロパティ)を
設けて、それを通じてやり取りする、という方法です。
Form1の側では、
Form2 fm2 = new Form2();
としたあと、
fm2.xxx = ・・・
で必要な情報を相手に渡し、
textBox3.Text = fm2.yyy;
というように情報を受け取ります。

DialogResultの値は見ないのでしょうか?
もし見て、それがOKの場合のみ、Form2の側で設定された値を
使いたいという場合、以下のようになるはずです。

if (fm2.ShowDialog(this)== DialogResult.OK) {
textBox3.Text = fm2.yyy;
}

もちろん、初めの方法でも、予めForm1の側で変更される可能性の
あるメンバをバックアップしておいて、Cancelだったらそれを使って
元に戻すということもできますが。。。

。。。

初めの方法を嫌がる人は(おそらくたくさん)います。
・Form2の側にForm1という文字を書かなくてはならない
 → 子は親に依存させたくない
・Form1の側でForm2でForm1の値変更の管理ができない
などという理由からです。
後者の方法ならば、
・Form2の側にForm1という文字を書かないで済む
・最終的に、Form2側で入れた値を使うかどうかがForm1側で分かる
からです。

丸岡孝司著「絶対現場主義 Visual C#実践講座」では、前者の方法について、
以下のように書かれています。
http://www.amazon.co.jp/%E7%B5%B6%E5%AF%BE%E7%8F%BE%E5%A0%B4%E4%B8%BB%E7%BE%A9Visual-%E5%AE%9F%E8%B7%B5%E8%AC%9B%E5%BA%A7%E2%80%95%E9%96%8B%E7%99%BA%E3%81%AE%E7%8F%BE%E5%A0%B4%E3%81%8B%E3%82%89%E7%94%9F%E3%81%BE%E3%82%8C%E3%81%9F%E5%AE%9F%E8%B7%B5%E3%83%86%E3%82%AF%E3%83%8B%E3%83%83%E3%82%AF-TIPS%E9%9B%86-%E4%B8%B8%E5%B2%A1-%E5%AD%9D%E5%8F%B8/dp/4899771975
----------------------------
サブフォーム側では、「Owner」プロパティを呼び出し元画面の型でキャストすれば、
そのプロパティを「えへへ。参照し放題ですぜ」というわけだ。
さらに、フォームに乗せてあるコントロールのModifiersプロパティを
Publicなんぞにした日にゃあなた、こりゃタマリませんなあということになる。
いかがだろうか。実際問題、荒業も程があるのであって、決してこの方法を
選択してはならないぞ。
----------------------------

。。。

といいつつ、自分の趣味プログラムでは、
楽なので前者の方法ばかりを使っています。。。

どう回答したものかとかなり悩みました。
いろいろな考え方があるので。。。

コンストラクタのオーバーロードで自分自分を渡すという
suffreさんの方法もなるほどーと思いました。
「あり」だと思います。

他に方法がいくつかあります。
2つだけ紹介します。

ひとつは、
fm.ShowDialog(this);
と、Owner指定なるものを使って、自分を渡す方法です。
これが一番楽かな、と思っています。
渡されたForm2の方では、
this.OwnerをForm1でキャストすれば、
suffreさんの方法と同じようにForm1のPublicのメンバに
ア...続きを読む

QC#「オブジェクト参照が必要です」(初心者)

Visual C# 2008を学習中なんですが、とりあえず何か作ってみようと思って、パラパラマンガに挑戦してみました。
Form1にpictureBox1を作り、waitを入れてイメージを書き換えるという単純なものです。
ところが実行しようと思ったら、「静的でないフィールド、メソッド、またはプロパティ’WindowsFormApplication1.Form1.pictureBox1’でオブジェクト参照が必要です」というエラーが出ます。その際のフォーカスは、main()内の
Form1.pictureBox1.image = Image.FromFile("motion1.png");
”Form1.pictureBox1”に当てられています。

何が原因と考えられるでしょうか。
もし情報不足であればご指摘いただくか、あるいはこの目的においてやらなければいけないこと、を大雑把に教えていただくだけでも幸いです。
よろしくお願いします。

Aベストアンサー

main()内に記述されているとのことですので、たぶん、
Form1.pictureBox1.Image=Image.FromFile("motion1.png");
Application.Run(new Form1());
と書いているのではないでしょうか?

連載 改訂版 C#入門 第3章 クラスとインスタンス
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_003/cs2_003_01.html#cs0302

ここであるように、オブジェクト指向にはクラスとインスタンスという概念があります。
今のコードでは、Form1クラスを操作しようとしているのでそのようなエラーが出ます。

具体的な解決方法としては、PictureBoxに初期画像を設定する処理をForm1のコンストラクタでやるのがいいと思います。
その際、redfox63さんがおっしゃられるように
this.pictureBox1
と記述することが必要です。(thisは自分自身のインスタンスを指します)

後は、Windowsフォームで一定間隔での処理をするための「Timerコンポーネント」について調べてみたらいいと思います。

タイマにより一定時間間隔で処理を行うには?(Windowsタイマ編)
http://www.atmarkit.co.jp/fdotnet/dotnettips/372formstimer/formstimer.html

MSDNライブラリ Timerクラス
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.timer.aspx

参考URL:http://www.atmarkit.co.jp/fdotnet/csharp_abc2/index/

main()内に記述されているとのことですので、たぶん、
Form1.pictureBox1.Image=Image.FromFile("motion1.png");
Application.Run(new Form1());
と書いているのではないでしょうか?

連載 改訂版 C#入門 第3章 クラスとインスタンス
http://www.atmarkit.co.jp/fdotnet/csharp_abc2/csabc2_003/cs2_003_01.html#cs0302

ここであるように、オブジェクト指向にはクラスとインスタンスという概念があります。
今のコードでは、Form1クラスを操作しようとしているのでそのようなエラーが出ます。

具...続きを読む

QC#にて別クラスの関数を使いたい

C#にて、別クラスの関数を使用する方法を教えてほしいです。

下記のような、構造体を受け取るメソッドを作りました。

*****************************
private struct MyPoint
{
public int x;
public int y;
}

private void proc1(MyPoint pt)
{
MessageBox.Show("座標:" ; pt.x + "," + pt.y + "実行結果");
}

private void button1_Click(object sender ,System.EventArgs e)
{

MyPoint pt;
pt.x = 10;
pt.y = 20;
proc(pt);
}
*****************************

別のフォームのクラスから、proc1を呼び出したいのですが、やり方がわかりません。
どうか、教えてください。

Aベストアンサー

同じ定義をしたとしても別の名前空間に書いた構造体は同一とはみなされません。

呼び出し先クラスでの構造体を private では無く、public で宣言して下さい。

呼び出し元では、

MyClass.MyPoint pt;

のようにして実体を作ります。

QC#で共有変数の定義をするには

C#で共有変数の定義をするには、どうしたらよいでしょうか。具体的には、起動パラメータで、任意の文字列(3~4バイト)を渡して、C#アプリケーションを、起動し、プログラムの任意の場所で、そのパラメータを参照したいと考えています。起動パラメータの受け取りは、できるのですが、そのパラメータを、プログラムのどこからも参照できる領域(ここの定義方法が不明)に格納するには、どうしたらよいでしょうか。(2重起動を許す前提です。実行時に1つの目のプログラムにはパラメータ"XYZ"を渡し、2つ目のプログラムを起動時にはパラメータ"ABCD"を渡し、その値により、プログラムの動作を制御したいと思っています)
Windows-xp visual-studio2008 C#でwindowsアプリケーションを作成しています。

Aベストアンサー

namespace test1
{
  static class Program
  {
    /// <summary>
    /// アプリケーションのメイン エントリ ポイントです。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
      if (args.Length > 0)
      {
        strArg = args[0];
      }
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(new Form1());
    }
    // ここに記述
    static public string strArg = null;
  }
}

メインクラスのメンバーとしてスコープが有効な場所に記述します

namespace test1
{
  static class Program
  {
    /// <summary>
    /// アプリケーションのメイン エントリ ポイントです。
    /// </summary>
    [STAThread]
    static void Main(string[] args)
    {
      if (args.Length > 0)
      {
        strArg = args[0];
      }
      Application.EnableVisualStyles();
      Application.SetCompatibleTextRenderingDefault(false);
      Application.Run(n...続きを読む

QC#で変数名の取得

C#2.0を使っています。

例えば
string s = "test";
という変数名「s」があったときに、この変数名を
Reflectionか何かを利用して取得することはできないでしょうか?

s.GetType().NameなどでString(型)は取得できるのですが
変数名「s」を取得したいのです。

Aベストアンサー

変数といえば、「フィールド」「引数」「ローカル変数」がありますがどれでしょうか?
私の調べた範囲では、

「フィールド」は可能
「引数」はNameからインスタンスが取れないので無理
「ローカル変数」はNameも取れないので無理(コンパイルした時点で名前を保持していない?)


namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
(new myClass()).foo("引数");
}
}

class myClass
{
string s1 = "フィールド";

public void foo(string s2)
{
string s3 = "ローカル変数";

//フィールドの情報
FieldInfo[] fields = this.GetType().GetFields(BindingFlags.NonPublic | BindingFlags.Instance);
foreach (FieldInfo field in fields) {
object v = field.GetValue(this);
Console.WriteLine("[field]" + field.Name + "=" + v +"," + (v == (object)s1));
}

//引数の情報
ParameterInfo[] parameters = MethodBase.GetCurrentMethod().GetParameters();
foreach (ParameterInfo parameter in parameters) {
Console.WriteLine("[parameter]" + parameter.Name);
}

//ローカル変数の情報
IList<LocalVariableInfo> localVariables = MethodBase.GetCurrentMethod().GetMethodBody().LocalVariables;
foreach (LocalVariableInfo localVariable in localVariables) {
Console.WriteLine("[localVariable]" + localVariable.LocalType);
}
}
}
}

変数といえば、「フィールド」「引数」「ローカル変数」がありますがどれでしょうか?
私の調べた範囲では、

「フィールド」は可能
「引数」はNameからインスタンスが取れないので無理
「ローカル変数」はNameも取れないので無理(コンパイルした時点で名前を保持していない?)


namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
(new myClass()).foo("引数");
}
}

class myClass
{
string s1 = "フィールド";

public void foo(string s2)
{
str...続きを読む

QC#のループでtextboxに値を入れる方法

Nameが

textbox1
textbox2
...
textbox10

と10個のtextboxがあったとして、

このそれぞれのtextに値を入れたいのですが、
1個ずつ書くのではなく、forとかで入れることは出来ますか?

たとえば以下のように、ループで○の部分を変更していくことは可能なのでしょうか?
for (int i=1; i<=10; i++)
{
textbox○.text = i.ToString();
}


よろしくお願いします。

Aベストアンサー

>基本的にはボタンのクリックイベントの中に書いています。

こちらでは問題ありませんけど…なにが 違うんですかねぇ…。

>フォームのインスタンスで実行するなら、

インスタンスではなくコンストラクタでした。
まぁ、InitializeComponent()を実行した後であれば、可能な……ハズなんですけど。

半角での名前は、大文字小文字は区別しないで動作してくれるようですが、
いわゆる全角と半角は区別するでしょうから、その辺りの違いですかねぇ……。

Q動的な変数名のつけ方について

■環境
OS:XP
言語:C++
コンパイラ:Visual C++ 2008

char*やstd::string等で格納された文字列を使用して
変数を宣言することは可能でしょうか。

用途として、テキストファイル等から文字列を取得し
その文字列を変数名としてプログラミング内で使用するという方法を考えています。

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

Aベストアンサー

動的な変数はたま~~~に欲しくなったりするんですが…。

本来の意味での変数とは少し違いますが、私の場合は添字参照演算子を使った擬似変数クラスを使います。
(簡単にint変数とします)
-----------
class CVirVar {
public:
  int & operator[](char* szVarName) {
    // 変数を探し出しす
    return 見つけた変数;
  }
}
-----------

用法
-----------
CVirVar var;
int   a;
char  name[] = "ほげ";
var[name] = 1;
a = var[name];
-----------

_variant_tとかで扱うとエラーも返せるし色んな型が格納できるので、一度作っておくと便利(?)ですよ。

QC# インスタンスの破棄

C#でインスタンスの破棄を明示的に行いたいのですが、
実際の開発現場では、どのように行っているのでしょうか?

自分で調べると「ガベージコレクタ」が暗黙的に行っているようですが明示的には行わないのが普通なのでしょうか?
もしくは、「Dispose」を使用して明示的に行うのが普通なのでしょうか?

実際に開発されている方からすると簡単な事かもしれませんが教えて頂けると助かります。

以上ですが、よろしくお願いいたします。

Aベストアンサー

結論から言うと、どちらでも良いです。
できれば生成から破棄まで考えて開発できると良いですね。

ガベージコレクションが実行されることで自動開放されますから、
一切.close()や.dispose()を使わなかったとしてもプログラムが
不正終了してしまう事はほとんどありません。

実際の開発では使わなくなったものを使わなくなった時点で
明示的に破棄することが多いです。正確には明示的に破棄するもの、
明示的に破棄しないもの、の2種類に分類しています。

例えばファイルを読み書きするストリーム系のオブジェクトや
データベースとのコネクションなどです。これは開発会社や
開発チーム、案件によって若干違っていて、徹底するところや
適当なところもあります。個人的には徹底したい派ですが。。。

ガベージコレクションが発生するとプログラムの実行動作が
遅くなり、また瞬間的に大きな負担がかかることがあります。
そのため全てをガベージコレクタに任せるのではなく、
明示的に開放できるもの、メモリを大量に消費するものは
その都度、適切に開放していくことで処理効率が良くなります。

プログラミング関連の調べ物で、サンプルソース等を見ることが
あるかと思います。この時サンプルで明示的に開放していたら、
それは明示的に開放したほうが良いもの、と思いましょう。
これだけでもステップアップになりますね。

結論から言うと、どちらでも良いです。
できれば生成から破棄まで考えて開発できると良いですね。

ガベージコレクションが実行されることで自動開放されますから、
一切.close()や.dispose()を使わなかったとしてもプログラムが
不正終了してしまう事はほとんどありません。

実際の開発では使わなくなったものを使わなくなった時点で
明示的に破棄することが多いです。正確には明示的に破棄するもの、
明示的に破棄しないもの、の2種類に分類しています。

例えばファイルを読み書きするストリーム...続きを読む

Q【C#】 あるイベントから別イベントを呼び出す。

タイトルの通り、あるイベント内から別イベントの処理を呼び出したいと
考えています。ですが、方法がわかりません。

【質問投稿に至った経緯】
現状は、検索から一覧を表示し1つを選択、選択した内容の更新を行なうプログラムを作成しています。選択した内容を更新するところまではできました。ただ、更新内容を確認できるよう一覧画面に前回検索した内容を一覧表示させたいと考えています。この時、検索イベントを呼び出し、一覧を再表示させようと思っています。

Aベストアンサー

「検索イベント」とは、[検索]ボタンをクリックした時の
イベント処理の事でしょうか?
それならば、一覧表示処理を別ルーチンに分けて、[検索]
ボタンClickイベントと同じルーチンをCallする様にすれば
良いと思いますが?


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング