- PR -

[Windows C#.NET]TabControlに貼り付けたComboBoxの値の保持

投稿者投稿内容
まゆりん
ぬし
会議室デビュー日: 2002/08/12
投稿数: 539
お住まい・勤務地: よこはま
投稿日時: 2004-01-07 15:56
遅れながら、あけましておめでとうございます。
本年もよろしくお願い致します。

えー、今年からC#.NET(しかもWinAP)を始めました。(昨年はVBでASP.NET)
早速ですが、

1.Form上にTabControlを配置し、TabPageを作成。
2.そのうち1つのTabPage上にComboBoxを配置。
3.実行してComboBoxのあるTabPageに移動。
4.ComboBoxから適当に選択(先頭項目以外)して別のTabPageに移動。
5.再びComboBoxのあるTabPageに移動。
とすると、選択値が保持されず先頭項目が表示されてしまいました。

ComboBoxのあるTabPageを表示する際に
ComboBoxを再描画しているように見受けられたので、
ComboBoxのSelectedIndexChangedイベントで選択したIndexを変数に格納し、
TabControlのSelectedIndexChangedイベントでSelectedIndexに変数の値を設定して回避しました。

というわけで、今回は
「上記の回避方法より簡単に値を保持する方法はあるのか?」
「なぜ再描画されてしまうのか?(初期化されてしまうのか?)」
についてご教授頂きたく宜しくお願い致します。
#WebAPと勝手が違うので混乱してます・・・。

コード:

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

///////////// Proc /////////////
ComboBox1.DataSource = new ArrayList();
((ArrayList)ComboBox1.DataSource).Add(new ListValueMember("Item0",0));
((ArrayList)ComboBox1.DataSource).Add(new ListValueMember("Item1",1));
((ArrayList)ComboBox1.DataSource).Add(new ListValueMember("Item2",2));
((ArrayList)ComboBox1.DataSource).Add(new ListValueMember("Item3",3));
ComboBox1.DisplayMember = "DisplayMember";
ComboBox1.ValueMember = "ValueMember";
}

private class ListValueMember
{
private int mValueMember;
private string mDisplayMember;

public ListValueMember(string DisplayMember, int ValueMember)
{
this.mValueMember = ValueMember;
this.mDisplayMember = DisplayMember;
}

public int ValueMember
{
get
{
return mValueMember;
}
}
public string DisplayMember
{
get
{
return mDisplayMember;
}
}
}



----------------------
VS.NET 2003
Windows AP(C#)

----------------------
追記:
ComboBoxのDropDownStyleプロパティは「DropDownList」に設定しています。

自分は先の回避方法で良いと思っているのですが、
どうなのでしょうか・・・


[ メッセージ編集済み 編集者: まゆりん 編集日時 2004-01-07 17:02 ]
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-01-07 17:09
引用:

まゆりんさんの書き込み (2004-01-07 15:56) より:

1.Form上にTabControlを配置し、TabPageを作成。
2.そのうち1つのTabPage上にComboBoxを配置。
3.実行してComboBoxのあるTabPageに移動。
4.ComboBoxから適当に選択(先頭項目以外)して別のTabPageに移動。
5.再びComboBoxのあるTabPageに移動。
とすると、選択値が保持されず先頭項目が表示されてしまいました。


 そのようにしてみましたが、ちゃんと保持されています。VB.NETですけど。C#と挙動が違うのかな?
#そういや、なんか、前にもにたような質問があったような?
#C#で確認しようとしたら、Windows Formが作れないぞ?なんかいじったかな?
#「歌って踊れる・・・」につっこもうと思ったのに
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2004-01-07 17:27
私のところ(VS.net 2002)でも確認しました。

ComboBoxのDropDownStyleがDropDownListの場合は、確かに保持されませんでした。
DropDownStyleがDropDownまたはSimpleの場合は表示は保持されているが、
SelectedIndexをとると保持されていませんでした。

Form1_Loadの中身を以下のように変更したら保持されるようになりました。
コード:
ComboBox1.Items.Add(new ListValueMember("Item0",0));

ComboBox1.Items.Add(new ListValueMember("Item1",1));
ComboBox1.Items.Add(new ListValueMember("Item2",2));
ComboBox1.Items.Add(new ListValueMember("Item3",3));
ComboBox1.DisplayMember = "DisplayMember";
ComboBox1.ValueMember = "ValueMember";


あるいは、ArrayListを使いたいのであれば
コード:
ArrayList ar = new ArrayList();

ar.Add(new ListValueMember("Item0",0));
ar.Add(new ListValueMember("Item1",1));
ar.Add(new ListValueMember("Item2",2));
ar.Add(new ListValueMember("Item3",3));
ComboBox1.DataSource = ar;
ComboBox1.DisplayMember = "DisplayMember";
ComboBox1.ValueMember = "ValueMember";


理由は・・わかりません。

[編集]
再現しましたが、もとのタブにもどったとき、先頭項目ではなく
非選択状態(SelectedIndex=-1)になりました。

[ メッセージ編集済み 編集者: べる 編集日時 2004-01-07 17:43 ]
まゆりん
ぬし
会議室デビュー日: 2002/08/12
投稿数: 539
お住まい・勤務地: よこはま
投稿日時: 2004-01-07 17:28
Jittaさん、こんにちは。

引用:

Jittaさんの書き込み (2004-01-07 17:09) より:

 そのようにしてみましたが、ちゃんと保持されています。VB.NETですけど。C#と挙動が違うのかな?
#そういや、なんか、前にもにたような質問があったような?
#C#で確認しようとしたら、Windows Formが作れないぞ?なんかいじったかな?



Googleってみたんですが、同じような内容は見当たらなかったですねぇ。
ちなみにVB.NETはインストールしてないので確認出来ませんでした。
(ドライブの容量が少なくて・・・)

引用:

#「歌って踊れる・・・」につっこもうと思ったのに


どーぞ遠慮なく突っ込んでください。
#入社した時に先輩が言っていたので強制的な目標です(笑)
_________________
まゆりん@目標は歌って踊れるSE(笑)
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-01-07 17:33
まゆりんさん、Jittaさん、こんにちわ。諸農です。

引用:

Jittaさんの書き込み (2004-01-07 17:09) より:

 そのようにしてみましたが、ちゃんと保持されています。VB.NETですけど。C#と挙動が違うのかな?



今、Borland C#Builderの環境しかないのですが、
同じ事を試してみました。
再現できませんね。。

もしかしたらほかに原因要因があるのかもしれませんね。

-編集補足-
ということでしたが、ListValueMemberを使ったら再現できました。
単純に文字をセットした場合とは違うようですね。


ではでは(^^)/

_________________
諸農和岳
Powered by Borland Delphi/C++Builder & Microsoft VS.NET

[ メッセージ編集済み 編集者: Jubei 編集日時 2004-01-07 17:38 ]
kagura
常連さん
会議室デビュー日: 2003/03/26
投稿数: 27
投稿日時: 2004-01-07 20:29
私のところでは再現出来ませんでした・・・
何でしょうねぇ。
コレ
一応バージョン情報を
Microsoft Visual C# .NET 55607-652-0000007-18146

--編集--
あ、失礼しました。

DropDownStyleがDropDownList時は保存されませんねぇ・・・
DropDownList・・・保存されず
DropDown・・・・・保存される
むー。

[ メッセージ編集済み 編集者: kagura 編集日時 2004-01-07 20:32 ]
iStation
大ベテラン
会議室デビュー日: 2003/12/08
投稿数: 158
投稿日時: 2004-01-08 09:27
はじめまして、iStationです。
引用:

一応バージョン情報を
Microsoft Visual C# .NET 55607-652-0000007-18146
...

DropDownStyleがDropDownList時は保存されませんねぇ・・・
DropDownList・・・保存されず
DropDown・・・・・保存される


Microsoft Visual C# .NET 55607-652-0000007-18218 では、
DropDownList、DropDownとも保存されませんね...

MSILをみると、
((ArrayList)comboBox1.DataSource).Add(new ListValueMember("Item0",0));に対し、set_DataSource(object)ではなくてget_DataSource()が呼び出されています。
この辺が原因ではないでしょうか?!

Microsoft Visual C# .NET 55607-652-0000007-18146 の
DropDownList、DropDown設定時、各々のMSILを調べてみてください。

kagura
常連さん
会議室デビュー日: 2003/03/26
投稿数: 27
投稿日時: 2004-01-08 10:35
MSILで見た結果ですがDropDown・DropDownList共に差異はなく
get_DataSourceが使用されています

スキルアップ/キャリアアップ(JOB@IT)