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

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

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

動的に作成したcomboBoxの初期値

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

■96058 / inTopicNo.1)  動的に作成したcomboBoxの初期値
  
□投稿者/ やま (7回)-(2020/10/19(Mon) 14:25:51)

分類:[.NET 全般] 

開発環境 VS2019
使用言語 C#Windowsフォーム

現在、動的にコンボボックスを作成し条件によってコンボボックスの初期値を変えたいのですが、上手く行きません。

ComboBox comboBox1 =new ComboBox(); ←5個作成
List<ComboBox> clist1=new List<ComboBox>();
comboBox1.SelectedIndex = 2;
panel.Controls.Add(comboBox1);

ComboBox comboBox2 =new ComboBox(); ←5個作成
List<ComboBox> clist2=new List<ComboBox>();
comboBox.SelectedIndex = 0;
panel.Controls.Add(comboBox2);

名前を別にしても、comboBox2で設定した初期値しか反映されません。
どうしたら良いでしょうか。







引用返信 編集キー/
■96059 / inTopicNo.2)  Re[1]: 動的に作成したcomboBoxの初期値
□投稿者/ 魔界の仮面弁士 (2876回)-(2020/10/19(Mon) 15:15:36)
No96058 (やま さん) に返信
> 名前を別にしても、comboBox2で設定した初期値しか反映されません。
初期値というのは、何の事を指していますか?
また、「反映されない」というのは、どうなって欲しいのに、実際にはどうなってしまうのでしょうか。


> ←5個作成
ソースコードを省略せずに、「現象を再現できる『最低限』の検証コード」を貼ってください。
掲示板に記述されていない箇所に問題があった場合、それを想像で補って指摘するのは困難です。


たとえば、panel.Controls.Add しているのであれば、どの座標に追加するのかの指定
(あるいは、位置を自動割り当てしてくれるような FlowLayoutPanel の利用)が
あると思いますが、それが無い場合、常時パネルの左上に重なって配置されてしまうでしょう。


また SelectedIndex を設定しているからには、少なくとも
.Items への .Add / .AddRange もしくは .DataSource への割当があるはずですよね。

もしも comboBox1.DataSource と comboBox2.DataSource に割り当てているオブジェクトが
同一インスタンスだった場合、BindingContext の働きにより、選択情報が共有されることになります。


private void Form1_Load(object sender, EventArgs e)
{
  string[] items = { "aaa", "bbb", "ccc", "ddd", "eee", "fff" };
  // comboBox1 と comboBox2 の DataSource は同一インスタンス
  // comboBox3 のものは同一内容の複製
  comboBox1.DataSource = items;
  comboBox2.DataSource = items;
  comboBox3.DataSource = items.Clone();
  // SelectedIndex を comboBox2 だけを変更しているのに
  // comboBox1 の SelectedIndex も連動する
  comboBox2.SelectedIndex = 2;
}
引用返信 編集キー/
■96060 / inTopicNo.3)  Re[2]: 動的に作成したcomboBoxの初期値
□投稿者/ やま (9回)-(2020/10/19(Mon) 15:54:19)
No96059 (魔界の仮面弁士 さん) に返信
> ■No96058 (やま さん) に返信
>>名前を別にしても、comboBox2で設定した初期値しか反映されません。
> 初期値というのは、何の事を指していますか?
> また、「反映されない」というのは、どうなって欲しいのに、実際にはどうなってしまうのでしょうか。

---------------------------------------------------------------------------------------------------
魔界の仮面弁士 さん、すみません。
以下の通りです。
名前を変えてインスタンスを作成したので、パネルに
comboBox1とcomboBox2のふたつのcomboBoxが表示されると思いましたが
実際は、片方しか出せないので困っています。

以下は1つのボタンを押したときの処理の中身です

ComboBox combo1 = new ComboBox();
combo1.Items.Add("京都");
combo1.Items.Add("四条烏丸");
combo1.Items.Add("祇園");
combo1.Items.Add("伏見稲荷大社");
this.Controls.Add(combo1);
combo1.SelectedIndex = 3;
panel1.Controls.Add(combo1);


ComboBox combo2 = new ComboBox();
combo2.Items.Add("京都タワー");
combo2.Items.Add("オフィス街");
combo2.Items.Add("舞妓さん");
combo2.Items.Add("きつねさん");
this.Controls.Add(combo2);
combo2.SelectedIndex = 3;
panel1.Controls.Add(combo2);


私としては、2つのcomboBoxが表示され、それぞれ初期値はcombo1は伏見稲荷大社
が初期値として表示され、combo2はきつねさんが初期値として表示されるというふうにしたかったのですが。




    










引用返信 編集キー/
■96061 / inTopicNo.4)  Re[3]: 動的に作成したcomboBoxの初期値
□投稿者/ 魔界の仮面弁士 (2877回)-(2020/10/19(Mon) 16:15:01)
No96060 (やま さん) に返信
> 名前を変えてインスタンスを作成したので、パネルに
> comboBox1とcomboBox2のふたつのcomboBoxが表示されると思いましたが

No96059 で確認している件の再掲になりますが、
comboBox1.Location と
comboBox2.Location は、
異なる座標になっていますか?
引用返信 編集キー/
■96062 / inTopicNo.5)  Re[4]: 動的に作成したcomboBoxの初期値
□投稿者/ やま (10回)-(2020/10/19(Mon) 16:18:36)
No96061 (魔界の仮面弁士 さん) に返信
> ■No96060 (やま さん) に返信
>>名前を変えてインスタンスを作成したので、パネルに
>>comboBox1とcomboBox2のふたつのcomboBoxが表示されると思いましたが
>
> No96059 で確認している件の再掲になりますが、
> comboBox1.Location と
> comboBox2.Location は、
> 異なる座標になっていますか?
異なる座標にあります。

引用返信 編集キー/
■96063 / inTopicNo.6)  Re[5]: 動的に作成したcomboBoxの初期値
□投稿者/ 魔界の仮面弁士 (2878回)-(2020/10/19(Mon) 16:34:06)
No96062 (やま さん) に返信
>>No96059 で確認している件の再掲になりますが、
>>comboBox1.Location と
>>comboBox2.Location は、
>>異なる座標になっていますか?
> 異なる座標にあります。

異なる座標にするためのコードが見当たらないのですが、どの行がそれにあたるのでしょうか?
また、それらが異なる座標になっていることは、どのようにして確認されましたか?


そして、その Location の 原点となる (0, 0) は、どこの座標を指していると思いますか?

少なくとも先に提示されたコードでは、
>>>
>>>  this.Controls.Add(combo1);
>>> panel1.Controls.Add(combo1);
>>>
>>>  this.Controls.Add(combo2);
>>> panel1.Controls.Add(combo2);
>>>
のように、同じコントロールを this と panel1 の 2 箇所に配置しようとしています。
(実際には 2 つの親を持つことはできないため、Parent の差し替えになります)

確認した Location というのは、いずれの座標系に対する値を想定しておられるのでしょうか。
this に対するものなのか、panel1 に対するものなのか、あるいはスクリーン座標系に対するものなのか…。


また、これも No96059 で述べた事柄になりますが、配置先のパネルを一時的に
FlowLayoutPanel に差し替えた時にも、同じ事象が発生しますか?
引用返信 編集キー/
■96064 / inTopicNo.7)  Re[6]: 動的に作成したcomboBoxの初期値
□投稿者/ やま (11回)-(2020/10/19(Mon) 16:47:34)
No96063 (魔界の仮面弁士 さん) に返信
> ■No96062 (やま さん) に返信
> >>No96059 で確認している件の再掲になりますが、
> >>comboBox1.Location と
> >>comboBox2.Location は、
> >>異なる座標になっていますか?
>>異なる座標にあります。
>
> 異なる座標にするためのコードが見当たらないのですが、どの行がそれにあたるのでしょうか?
> また、それらが異なる座標になっていることは、どのようにして確認されましたか?
>
>
> そして、その Location の 原点となる (0, 0) は、どこの座標を指していると思いますか?
>
> 少なくとも先に提示されたコードでは、
> >>>
> >>>  this.Controls.Add(combo1);
> >>> panel1.Controls.Add(combo1);
> >>>
> >>>  this.Controls.Add(combo2);
> >>> panel1.Controls.Add(combo2);
> >>>
> のように、同じコントロールを this と panel1 の 2 箇所に配置しようとしています。
> (実際には 2 つの親を持つことはできないため、Parent の差し替えになります)
>
> 確認した Location というのは、いずれの座標系に対する値を想定しておられるのでしょうか。
> this に対するものなのか、panel1 に対するものなのか、あるいはスクリーン座標系に対するものなのか…。
>
>
> また、これも No96059 で述べた事柄になりますが、配置先のパネルを一時的に
> FlowLayoutPanel に差し替えた時にも、同じ事象が発生しますか


位置やコントロールの大きさは全て構造体で持っています。
そして、newしたところで実際に値を構造体から受け取っています。
コンボボックスX座標{100,200},
コンボボックスY座標{100,200},

combo1=コンボボックスX座標[index];
combo2=コンボボックスY座標[index];

FlowLayoutPanelでは発生しませんでしたが、パネルで同じことをしたいです。


引用返信 編集キー/
■96065 / inTopicNo.8)  Re[7]: 動的に作成したcomboBoxの初期値
□投稿者/ 魔界の仮面弁士 (2879回)-(2020/10/19(Mon) 17:00:16)
No96064 (やま さん) に返信
> 位置やコントロールの大きさは全て構造体で持っています。
> そして、newしたところで実際に値を構造体から受け取っています。

情報を【後出し】にせず、他者が現象を確認できるようなコードを提示してください。

掲示板に記述されていない箇所に問題があった場合、それを想像で補って指摘するのは困難です。
繰り返しのお願いになりますが、よろしくお願いいたします。


また、 No96063 で指摘した .Add の重複指定については、
実際のコードでもそのように書かれているということなのでしょうか。


> FlowLayoutPanelでは発生しませんでしたが、パネルで同じことをしたいです。

FlowLayoutPanel で発生せず、Panel で発生しているという事から、
座標とサイズの指定に問題がある可能性が非常に高いと考えられます。

しかしそれが、構造体の値に問題があったが故の問題なのか、
もしくは構造体の値を ComboBox に反映する手続きに問題があったのか、
あるいはそれ以外の理由なのか、今回の質問内容から読み取ることは不可能です。


配置完了後に、Button の Click イベント等に下記のコードを実行して、
各 ComboBox の座標が適切なものになっているかどうか、再確認してみてください。


foreach (var cmb in panel1.Controls.OfType<ComboBox>())
{
  MessageBox.Show(cmb.Bounds.ToString());
}
引用返信 編集キー/
■96077 / inTopicNo.9)  Re[1]: 動的に作成したcomboBoxの初期値
□投稿者/ やま (12回)-(2020/10/20(Tue) 07:55:52)
こちらは、一度締めきって改めて再度をさせていただきます。

回答をくださった皆様、ありがとうございました。
解決済み
引用返信 編集キー/

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


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

このトピックに書きこむ