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

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

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

Re[9]: 変数Xのとき comboBox(X)を操作したい


(過去ログ 41 を表示中)

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

■21430 / inTopicNo.1)  変数Xのとき comboBox(X)を操作したい
  
□投稿者/ 初心者です (1回)-(2008/07/01(Tue) 19:19:30)

分類:[.NET 全般] 

お世話になります。

変数Xを指定したとき、comboBox(X)を操作するにはどのように書けばよいでしょうか?
例えば X=2のとき comboBox2の値を取得したい という場合です。
comboBox+(X) ではうまくいきません。。

どうかよろしくお願いいたします。


引用返信 編集キー/
■21431 / inTopicNo.2)  Re[1]: 変数Xのとき comboBox(X)を操作したい
□投稿者/ 初心者です (3回)-(2008/07/01(Tue) 19:22:23)
No21430 (初心者です さん) に返信
> お世話になります。
>
> 変数Xを指定したとき、comboBox(X)を操作するにはどのように書けばよいでしょうか?
> 例えば X=2のとき comboBox2の値を取得したい という場合です。
> comboBox+(X) ではうまくいきません。。
>
> どうかよろしくお願いいたします。
>
>

申し訳ありません、言語はC#です。
引用返信 編集キー/
■21432 / inTopicNo.3)  Re[2]: 変数Xのとき comboBox(X)を操作したい
□投稿者/ いしだ (140回)-(2008/07/01(Tue) 19:42:28)
例えば、以下のような感じでしょうか。

(Controls["comboBox" + X.ToString()] as ComboBox).Text
引用返信 編集キー/
■21436 / inTopicNo.4)  Re[3]: 変数Xのとき comboBox(X)を操作したい
□投稿者/ 初心者です (4回)-(2008/07/01(Tue) 21:58:02)
No21432 (いしだ さん) に返信
> 例えば、以下のような感じでしょうか。
>
> (Controls["comboBox" + X.ToString()] as ComboBox).Text

いしださま

早速のご回答ありがとうございます。
お教えいただいた方法を試したところ、[new を使ってインスタンス化しなさい]みたいなエラーがでました。

今回は、
変数Xを決定
→FormにX個 comboBoxを追加
→comboBox(x)のlistIndexを取得
という動作を実現できたら、と思っております。

インスタンス化の部分も含めてご教授いただけたら幸いです。。


引用返信 編集キー/
■21437 / inTopicNo.5)  Re[4]: 変数Xのとき comboBox(X)を操作したい
□投稿者/ επιστημη (1127回)-(2008/07/01(Tue) 22:39:41)
επιστημη さんの Web サイト
> →FormにX個 comboBoxを追加

ComboBox[] boxes = new ComboBox[X];
for ( int i = 0; i < X; ++i ) {
  boxes[i] = new ComboBox();
  ...
}

> →comboBox(x)のlistIndexを取得

boxes[n] でn番目の ComboBoxが得られます。

引用返信 編集キー/
■21438 / inTopicNo.6)  Re[4]: 変数Xのとき comboBox(X)を操作したい
□投稿者/ やじゅ (470回)-(2008/07/01(Tue) 22:44:21)
やじゅ さんの Web サイト
No21436 (初心者です さん) に返信
>(Controls["comboBox" + X.ToString()] as ComboBox).Text
>
> お教えいただいた方法を試したところ、[new を使ってインスタンス化しなさい]みたいなエラーがでました。
>
> →FormにX個 comboBoxを追加
> →comboBox(x)のlistIndexを取得
> という動作を実現できたら、と思っております。
>

comboBoxをFormに追加してあるんですよね、各comboBoxのNameを
comboBox1、comboBox2、comboBox3 ・・・
としてあれば、いしださんの提示した例で問題ないと思います。
引用返信 編集キー/
■21439 / inTopicNo.7)  Re[5]: 変数Xのとき comboBox(X)を操作したい
□投稿者/ 杢 (1回)-(2008/07/01(Tue) 23:19:52)
for文で一括処理したい場合などには配列が便利ですね。
IDEで作った物を配列で扱うという想定で、お二人の例を混ぜてみました。


int x = 4;
ComboBox[] boxes = new ComboBox[x];

// 一括格納
for (int i = 0; i < x; i++)
{
    boxes[i] = (ComboBox) this.Controls["comboBox" + i.ToString()];
}

comboBox0のような名前を付ける事は希だと思うので、
インデックスを適宜読み替えてください。

コントロールの数が少ない場合や、それぞれ名前が異なる場合には
1個1個書くのもアリかと。

    boxes[0] = typeCmbBox;
    boxes[1] = colorCmbBox;
    boxes[2] = sizeCmbBox;

引用返信 編集キー/
■21445 / inTopicNo.8)  Re[6]: 変数Xのとき comboBox(X)を操作したい
□投稿者/ じゅで (71回)-(2008/07/02(Wed) 09:51:55)
Formの中のControlsからComboBoxの名称で取得するならこんな感じで

Control hoge = Constrols.Find("ComboBox" + x.ToString());
// ここは好きにしていただいて
((ComboBox)hoge).Text

コンパイルもしてないので、構文があってたか不明ですが、
こんな感じになります。

ちなみにFindは.NET Framework 2.0から使えたはずなので、
2005を使っているなら使えると思われます。


引用返信 編集キー/
■21449 / inTopicNo.9)  Re[6]: 変数Xのとき comboBox(X)を操作したい
□投稿者/ επιστημη (1128回)-(2008/07/02(Wed) 10:18:40)
επιστημη さんの Web サイト
2008/07/02(Wed) 10:23:26 編集(投稿者)

↓ちゃっちゃかちゃーとつくってみた。
http://cid-07c558f8e11e708f.skydrive.live.com/self.aspx/WillBeRemovedSoon/DynamicControlCreation.zip

※ 2,3日で消します。
引用返信 編集キー/
■21464 / inTopicNo.10)  Re[7]: 変数Xのとき comboBox(X)を操作したい
□投稿者/ 初心者です (5回)-(2008/07/02(Wed) 18:36:10)
みなさま

お忙しいところ本当にありがとうございました。
できれば後一点だけ。。ご指導いただければ幸いです。

numericUpDownを使って値を指定した時、その値分だけComboBoxを表示したいと思っています。
以下のように書いて、ElementNo_old <= ElementNoの時はComboBoxがうまく表示されたのですが、
numericUpDownの値を減らした時(ElementNo_old > ElementNoのとき)にうまくComboBoxが削除されません。
どこがおかしいのでしょうか。。。m(_ _)m

--------------------------------------------------------------------------------
private void numericUpDown7_ValueChanged(object sender, EventArgs e)
{
ElementNo = (int)numericUpDown7.Value;
ComboBox[] elements = new ComboBox[ElementNo];

if (ElementNo_old <= ElementNo)
{
for (i = 0; i < ElementNo; i++)
{
elements[i] = new ComboBox();
elements[i].Location = new Point(10, 200 + 20 * i);
elements[i].Size = new Size(47, 20);

this.Controls.Add(elements[i]);
ElementNo_old = elements.Length;
textBox1.Text = ElementNo_old.ToString();
}

}

if (ElementNo_old > ElementNo)
{
textBox2.Text = (ElementNo_old - 1).ToString();
int j = ElementNo_old-1;

if(this.Controls.Contains((ComboBox) this.Controls["elements"+j.ToString()]) ==true)
{

this.Controls.Remove((ComboBox) this.Controls["elements"+j.ToString()]);
}
}
引用返信 編集キー/
■21473 / inTopicNo.11)  Re[8]: 変数Xのとき comboBox(X)を操作したい
□投稿者/ ロック (28回)-(2008/07/02(Wed) 21:42:50)
まず追加するところですが、上手くいっているように見えて・・・
ElementNoが1の時、1を追加
ElementNoが2の時、1と2を追加
ElementNoが3の時、1と2と3を追加
とコントロールが重なって設定されているようなので、それを直した方がよさそうです
追加済みのコントロールは追加しないような仕組みが良いです。

あと、追加時にNameプロパティに名前を追加していないようなので
名前を明確に設定した方が良いと思います。
この部分から察するに「Controls["elements"+j.ToString()]」の部分が
理解されていないように思えますが、これは
Controls["elements1"]
Controls["elements2"]
Controls["elements3"]....
というアイテムを消そうとしているため、作成する段階で
"elements1"、"elements2"などの名前を付けておくべきです。
こんな感じ。elements[i].Name = "elements" + i.ToString();

と、理論付けていけば削除も上手くいくと思います。
プロパティの名前が一致していないのと
コントロールが重なって追加されているから消えてないように見えているのだと思います。

別の考え方として、追加の前に先に追加済みのコントロールを全部消してから
今の追加処理を実行するとか


本末転倒かもしれませんが、必要な分だけコントロールを作っておいて
Visible = true/falseで表示/非表示を切り替えるというのも選択の一つだと思います。


今回も勉強になりました。m(__)m

引用返信 編集キー/
■21483 / inTopicNo.12)  Re[9]: 変数Xのとき comboBox(X)を操作したい
□投稿者/ 初心者です (6回)-(2008/07/03(Thu) 08:35:18)
ロックさま

大変参考になりました。ありがとうございます。
コントロールの名前は全く気がつきませんでした。。

>別の考え方として、追加の前に先に追加済みのコントロールを全部消してから
>今の追加処理を実行するとか

これをトライしたかったんですが、「elements」と名前を付けたComboBoxの削除はどのように
行えばよいでしょうか? ご指摘いただいたプロパティの名前一致を修正すれば、
this. Contorols. Remove(elements[i]) でよいでしょうか?

たびたび申し訳ありません。


引用返信 編集キー/
■21485 / inTopicNo.13)  Re[10]: 変数Xのとき comboBox(X)を操作したい
□投稿者/ ロック (29回)-(2008/07/03(Thu) 09:35:49)
自分自身、ついこの間からC#をさわりはじめたばかりのヒヨっこなので
こういった質問は自分自身のスキルアップのために回答していきたいと思います。、

> これをトライしたかったんですが、「elements」と名前を付けたComboBoxの削除はどのように
> 行えばよいでしょうか? ご指摘いただいたプロパティの名前一致を修正すれば、
"elements"と名前付けてコントロールの削除は
this.Controls.Remove((ComboBox) this.Controls["elements"]);です。
ここから察するに、j.ToString()の部分をおまじないのように使われている感じがしますので解説すると
"elements"+j.ToString()でjが0の場合、"elements0"という文字列が生成されます。
よって作成時、"elements0"、"elements1"。。。という風に作っているなら削除時も同じく
その名前を使って削除すべきだと思います。
一度、
String name="elements"+j.ToString();
elements[i].Name =name;
this.Controls.Remove((ComboBox) this.Controls[name]);
と、それぞれ分解して実験してみた方が良いと思います。
#脱初心者の道は、常に実験の繰り返しですよ!


> this. Contorols. Remove(elements[i]) でよいでしょうか?
それでも良いですが、iが必ずしも追加したアイテムのインデックスとは限らないので(今回は上手くいきそうですが)
今の削除処理のようにName指定して削除の方が良いと思います。

>別の考え方として、追加の前に先に追加済みのコントロールを全部消してから
単純に、今のfor文のElementNoをElementNo_oldに変えて
中身を今の削除処理にしたら上手くいくと思います。
その場合、不要なifも出てくるのでデバッグで色々やってみてください。
引用返信 編集キー/
■21490 / inTopicNo.14)  Re[8]: 変数Xのとき comboBox(X)を操作したい
□投稿者/ επιστημη (1129回)-(2008/07/03(Thu) 11:18:10)
επιστημη さんの Web サイト
2008/07/03(Thu) 11:20:37 編集(投稿者)
> numericUpDownを使って値を指定した時、その値分だけComboBoxを表示したいと思っています。
> 以下のように書いて、ElementNo_old <= ElementNoの時はComboBoxがうまく表示されたのですが、
> numericUpDownの値を減らした時(ElementNo_old > ElementNoのとき)にうまくComboBoxが削除されません。

むずかしく考えすぎてない?

 private void btnAdd_Click(object sender, EventArgs e) {
   int o = panel2.Controls.Count; // 現在のラベル数
   int n = (int)nudLabels.Value;  // 目的のラベル数
   // 増えるとき
   if (o < n) {
     // o番〜n-1番を追加
     for ( int i = o; i < n; ++i ) {
       Label lbl = new Label();
       lbl.Name = string.Format("Label{0}",i);
       panel2.Controls.Add(lbl);
     }
   } else
   // 減るとき
   if (n < o) {
     // n番〜o-1番を削除
     for ( int i = n; i < o; ++i ) {
       Control ctl = panel2.Controls[string.Format("Label{0}",i)];
       panel2.Controls.Remove(ctl);
       ctl.Dispose();
     }
   }
 }

> this. Contorols. Remove(elements[i]) でよいでしょうか?

質問はやってみてから。

引用返信 編集キー/
■21573 / inTopicNo.15)  Re[9]: 変数Xのとき comboBox(X)を操作したい
□投稿者/ 初心者です (7回)-(2008/07/04(Fri) 14:38:23)
ロックさま、επιστημηさま

ご丁寧な回答本当にありがとうございました。
無事所望の動作を得ることができました。
大変勉強になりました。

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


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -