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

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

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

C# comboBoxに値を入れる

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

■96189 / inTopicNo.1)  C# comboBoxに値を入れる
  
□投稿者/ 川崎 (1回)-(2020/10/29(Thu) 11:07:55)

分類:[.NET 全般] 

構造体を使い、動的に作成したcomboBoxに値を代入するという事をしたい
と思っています。

・構造体名
 public struct KOTO
 {
   public string[,] category;
 }
・構造体の定義
 KOTO miyabi = new KOTO()
 {
  category = new string[,] { { "京都", "伏見", "祇園", "四条" },                { "どんぐり", "おいなりさん", "歩",                 "湯葉" }, }
       };
・ボタンをクリックすると、上記の構造体を値として持つcomboBoxが
 3個作成される
 int count = 2;
 int a = 10;
 object o = miyabi.category;
 for(int i = 0; i < 3; i++)
   {
ComboBox[] combo = new ComboBox[3];
combo[i].Items.AddRange();
combo[i].Left = a + 120;
combo[i].Top = a + 120;
combo[i].SelectedIndex = count;
Controls.Add(combo[i]);   
    panel1.Controls.Add(combo[i]);
   }

赤い波線で表示されているところの書き方で困っています。
miyabi.category[i,i]だとstringをobject[]に変換することは出来ませんとなるので、object型に変換すれば出来るのかと試しましたが
それでもダメでした。
どうすれば出来るか教えてください。

開発環境 VisualStudio2019
使用している言語 C# Windowsフォーム

以上です。


引用返信 編集キー/
■96190 / inTopicNo.2)  Re[1]: C# comboBoxに値を入れる
□投稿者/ WebSurfer (2138回)-(2020/10/29(Thu) 11:27:38)
No96189 (川崎 さん) に返信

> 赤い波線で表示されているところの書き方で困っています。

コードのどこですか? 

質問のコードで「stringをobject[]に変換することは出来ません」と出るのですか?

質問のコードは、

> object型に変換すれば出来るのかと試しました

・・・時のように見えるのですが?

引用返信 編集キー/
■96191 / inTopicNo.3)  Re[2]: C# comboBoxに値を入れる
□投稿者/ 川崎 (2回)-(2020/10/29(Thu) 11:37:36)
No96190 (WebSurfer さん) に返信
> ■No96189 (川崎 さん) に返信
>
>>赤い波線で表示されているところの書き方で困っています。
>
> コードのどこですか? 
>
> 質問のコードで「stringをobject[]に変換することは出来ません」と出るのですか?
>
> 質問のコードは、
>
>>object型に変換すれば出来るのかと試しました
>
> ・・・時のように見えるのですが?


直したい(=前回の投稿で赤い波線が表示されると表現した箇所)は


申し訳ありません。
コードを貼り付けた時は表示されていたので出るものだと思っていました。

combo[i].Items.AddRange();
↑ここです。ここの()の中の書き方に困っています。
前途の通り(miyabi.category[i,i])でエラー(stringをobjectに〜)になるので
object o = miyabi.category;とし
(o[])や(o[i,i])もダメでした。



引用返信 編集キー/
■96192 / inTopicNo.4)  Re[1]: C# comboBoxに値を入れる
□投稿者/ 魔界の仮面弁士 (2893回)-(2020/10/29(Thu) 11:47:47)
2020/10/29(Thu) 11:52:10 編集(投稿者)

No96189 (川崎 さん) に返信
> 構造体を使い、動的に作成したcomboBoxに値を代入するという事をしたい
> と思っています。

class の方が望ましい気がしますが、struct でないと駄目ですか?
https://dobon.net/vb/dotnet/beginner/whenusestruct.html


> public string[,] category;
二次元配列だと今回の要件では扱いにくいので、自分ならば
string の一次元配列の配列を採用します。
 public string[][] category;


とりあえず今回は 2 次元配列で話を進めますが…データは 2×4 の 8 要素なのですよね?
ComboBox は 3 つあるので、数が合致しませんが、どのように繋ぎたいのでしょうか?


> 上記の構造体を値として持つcomboBoxが 3個作成される
いいえ、ComboBox は 1 つも作成されていませんよ。
new ComboBox[] と new ComboBox() は別物なのでご注意を。


>  for(int i = 0; i < 3; i++)
>  {
>    ComboBox[] combo = new ComboBox[3];
>    combo[i].Items.AddRange();

これだと、「ComboBox を 3 つ格納できる配列」が
ループのたびに生成されてしまいます。
combo 変数の宣言はループの外で行いましょう。


また、これは「ComboBox の配列」を作成しただけであり、
肝心の「new ComboBox()」がありません。
new ComboBox[3] というのは、3 つの ComboBox を格納できる
配列を用意したわけであり、combo[0] , combo[1] , combo[2] という
個々の要素は null のままです。

ComboBox をセットするために
 combo[i] = new ComboBox() { Name = "combo" + i };
などを用意しましょう。


> combo[i].Items.AddRange();
丸括弧の中身が空欄になっているので、コンパイルエラーになりますね。
.Items.Add や .Items.AddRange は、格納すべきデータを必要とします。

もし、配列が 2×4 ではなく 3×4 なら、3 つの ComboBox のために
たとえば下記のようなコードを用意することができます。

for (int j = 0; j <= miyabi.category.GetUpperBound(1); j++)
{
  combo[i].Items.Add(miyabi.category[i, j]);
}


> combo[i].Left = a + 120;
> combo[i].Top = a + 120;
変数 a の値はループ中で変更されていませんから、
このままでは、3 つの ComboBox がすべて同一座標に重なってしまいますよ。
意図的にそうしているわけでは無ければ、座標をずらした方が良いでしょう。

たとえば
 combo[i].Top = a * count + 120;
とか
 combo[i].Top = (a + 120) * i;
とか
 combo[i].Top = a + 120;
 a += combo[i].Height;
などのように。
引用返信 編集キー/
■96193 / inTopicNo.5)  Re[2]: C# comboBoxに値を入れる
□投稿者/ 川崎 (3回)-(2020/10/29(Thu) 13:46:47)
No96192 (魔界の仮面弁士 さん) に返信
> 2020/10/29(Thu) 11:52:10 編集(投稿者)
>
> ■No96189 (川崎 さん) に返信
>>構造体を使い、動的に作成したcomboBoxに値を代入するという事をしたい
>>と思っています。
>
> class の方が望ましい気がしますが、struct でないと駄目ですか?
> https://dobon.net/vb/dotnet/beginner/whenusestruct.html
>
>
>>public string[,] category;
> 二次元配列だと今回の要件では扱いにくいので、自分ならば
> string の一次元配列の配列を採用します。
>  public string[][] category;
>
>
> とりあえず今回は 2 次元配列で話を進めますが…データは 2×4 の 8 要素なのですよね?
> ComboBox は 3 つあるので、数が合致しませんが、どのように繋ぎたいのでしょうか?
>
>
>>上記の構造体を値として持つcomboBoxが 3個作成される
> いいえ、ComboBox は 1 つも作成されていませんよ。
> new ComboBox[] と new ComboBox() は別物なのでご注意を。
>
>
>> for(int i = 0; i < 3; i++)
>> {
>>   ComboBox[] combo = new ComboBox[3];
>>   combo[i].Items.AddRange();
>
> これだと、「ComboBox を 3 つ格納できる配列」が
> ループのたびに生成されてしまいます。
> combo 変数の宣言はループの外で行いましょう。
>
>
> また、これは「ComboBox の配列」を作成しただけであり、
> 肝心の「new ComboBox()」がありません。
> new ComboBox[3] というのは、3 つの ComboBox を格納できる
> 配列を用意したわけであり、combo[0] , combo[1] , combo[2] という
> 個々の要素は null のままです。
>
> ComboBox をセットするために
>  combo[i] = new ComboBox() { Name = "combo" + i };
> などを用意しましょう。
>
>
>>combo[i].Items.AddRange();
> 丸括弧の中身が空欄になっているので、コンパイルエラーになりますね。
> .Items.Add や .Items.AddRange は、格納すべきデータを必要とします。
>
> もし、配列が 2×4 ではなく 3×4 なら、3 つの ComboBox のために
> たとえば下記のようなコードを用意することができます。
>
> for (int j = 0; j <= miyabi.category.GetUpperBound(1); j++)
> {
>   combo[i].Items.Add(miyabi.category[i, j]);
> }
>
>
>>combo[i].Left = a + 120;
>>combo[i].Top = a + 120;
> 変数 a の値はループ中で変更されていませんから、
> このままでは、3 つの ComboBox がすべて同一座標に重なってしまいますよ。
> 意図的にそうしているわけでは無ければ、座標をずらした方が良いでしょう。
>
> たとえば
>  combo[i].Top = a * count + 120;
> とか
>  combo[i].Top = (a + 120) * i;
> とか
>  combo[i].Top = a + 120;
>  a += combo[i].Height;
> などのように。



返信を有難うございます。
Addの箇所はおかげさまで上手く行きましたが
実際にフォームにAddするところでエラー(角かっこ[]付インデックスをComboBox型の式に適用する事は出来ないというエラー)が出たので
実際には表示出来ませんでした。

最初はクラスを考えたのですが、派生クラスでオーバーライドするという感じで。
こちらの方が分かりやすいという事で、構造体を使用する事になりました。
引用返信 編集キー/
■96194 / inTopicNo.6)  Re[2]: C# comboBoxに値を入れる
□投稿者/ 川崎 (4回)-(2020/10/29(Thu) 13:54:04)
No96192 (魔界の仮面弁士 さん) に返信
> 2020/10/29(Thu) 11:52:10 編集(投稿者)
>
> ■No96189 (川崎 さん) に返信
>>構造体を使い、動的に作成したcomboBoxに値を代入するという事をしたい
>>と思っています。
>
> class の方が望ましい気がしますが、struct でないと駄目ですか?
> https://dobon.net/vb/dotnet/beginner/whenusestruct.html
>
>
>>public string[,] category;
> 二次元配列だと今回の要件では扱いにくいので、自分ならば
> string の一次元配列の配列を採用します。
>  public string[][] category;

これも試してみましたが、初期化子が適当ではないという様な内容のエラーが出てしまい
断念しました。
出来れば、こちらの方が扱いやすいのでいいと思います。

>
> とりあえず今回は 2 次元配列で話を進めますが…データは 2×4 の 8 要素なのですよね?
> ComboBox は 3 つあるので、数が合致しませんが、どのように繋ぎたいのでしょうか?

1つのcomboBoxのアイテムに {}1つがまるっと入るイメージです。
なので、配列の中身は下記の様になります。
{ "京都", "伏見", "祇園", "四条" }, { "どんぐり", "おいなりさん", "歩", "湯葉" },{"大丸","伊勢丹","高島屋","三越" }
1つ目のcomboBoxのアイテムは{ "京都", "伏見", "祇園", "四条" }
2つ目のcomboBoxのアイテムは{ "どんぐり", "おいなりさん", "歩", "湯葉" }
3つ目のcomboBoxのアイテムは{"大丸","伊勢丹","高島屋","三越" }
という感じです。





>
>>上記の構造体を値として持つcomboBoxが 3個作成される
> いいえ、ComboBox は 1 つも作成されていませんよ。
> new ComboBox[] と new ComboBox() は別物なのでご注意を。
>
>
>> for(int i = 0; i < 3; i++)
>> {
>>   ComboBox[] combo = new ComboBox[3];
>>   combo[i].Items.AddRange();
>
> これだと、「ComboBox を 3 つ格納できる配列」が
> ループのたびに生成されてしまいます。
> combo 変数の宣言はループの外で行いましょう。
>
>
> また、これは「ComboBox の配列」を作成しただけであり、
> 肝心の「new ComboBox()」がありません。
> new ComboBox[3] というのは、3 つの ComboBox を格納できる
> 配列を用意したわけであり、combo[0] , combo[1] , combo[2] という
> 個々の要素は null のままです。
>
> ComboBox をセットするために
>  combo[i] = new ComboBox() { Name = "combo" + i };
> などを用意しましょう。
>
>
>>combo[i].Items.AddRange();
> 丸括弧の中身が空欄になっているので、コンパイルエラーになりますね。
> .Items.Add や .Items.AddRange は、格納すべきデータを必要とします。
>
> もし、配列が 2×4 ではなく 3×4 なら、3 つの ComboBox のために
> たとえば下記のようなコードを用意することができます。
>
> for (int j = 0; j <= miyabi.category.GetUpperBound(1); j++)
> {
>   combo[i].Items.Add(miyabi.category[i, j]);
> }
>
>
>>combo[i].Left = a + 120;
>>combo[i].Top = a + 120;
> 変数 a の値はループ中で変更されていませんから、
> このままでは、3 つの ComboBox がすべて同一座標に重なってしまいますよ。
> 意図的にそうしているわけでは無ければ、座標をずらした方が良いでしょう。
>
> たとえば
>  combo[i].Top = a * count + 120;
> とか
>  combo[i].Top = (a + 120) * i;
> とか
>  combo[i].Top = a + 120;
>  a += combo[i].Height;
> などのように。
引用返信 編集キー/
■96195 / inTopicNo.7)  Re[3]: C# comboBoxに値を入れる
□投稿者/ 魔界の仮面弁士 (2894回)-(2020/10/29(Thu) 14:49:26)
引用は適切に。

No96194 (川崎 さん) に返信
> なので、配列の中身は下記の様になります。
> { "京都", "伏見", "祇園", "四条" }, { "どんぐり", "おいなりさん", "歩", "湯葉" },{"大丸","伊勢丹","高島屋","三越" }
No96189 の 2×4 は誤りで、実際には 3×4 なのでしょうか?

また、それぞれの項目数は 4 個固定で良いのでしょか?
実際には ComboBox ごとに項目数が異なったりはしませんか?


>>二次元配列だと今回の要件では扱いにくいので、自分ならば
>>string の一次元配列の配列を採用します。
>> public string[][] category;
> これも試してみましたが、初期化子が適当ではないという様な内容のエラーが出てしまい
> 断念しました。

string[][] categories =
{
  new [] { "京都", "伏見", "祇園", "四条" },
  new [] { "どんぐり", "おいなりさん", "歩", "湯葉" },
  new [] {"大丸","伊勢丹","高島屋","三越" }
};

for (int i = 0; i < categories.Length; i++)
{
  var combo = new ComboBox() { Name = "combo" + i };
  combo.Parent = panel1;
  combo.DropDownStyle = ComboBoxStyle.DropDownList;
  // combo.Items.AddRange(categories[i].ToArray());
  combo.DataSource = categories[i].ToArray();
  combo.Top = i * combo.Height;
  combo.SelectedIndex = 2;
}
引用返信 編集キー/
■96196 / inTopicNo.8)  Re[3]: C# comboBoxに値を入れる
□投稿者/ 川崎 (5回)-(2020/10/29(Thu) 15:16:00)
無事に解決しました。
ご協力頂きまして誠にありがとうございました。


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

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


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

このトピックに書きこむ