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

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

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

Re[6]: ComboBoxのValueMemberで複数フィールド


(過去ログ 95 を表示中)

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

■56960 / inTopicNo.1)  ComboBoxのValueMemberで複数フィールド
  
□投稿者/ miki (1回)-(2011/02/06(Sun) 22:23:15)

分類:[C#] 

お世話になります。
データベース(アクセスorオラクル)で、ComboBoxを利用してデータを選択登録したいです。
コンボボックスに表示する選択項目のキーが2個のフィールドで構成されている場合、ValueMemberで指定することができなくてこまっています。
カスタムコントロールを作成しようかとも思いましたが、どのような形なら2個のフィールドに対応できるのか、わかりません。
何かよいアイデアはないでしょうか。

VS2008、C#です。

よろしくお願いしますm(__)m。
引用返信 編集キー/
■56962 / inTopicNo.2)  Re[1]: ComboBoxのValueMemberで複数フィールド
□投稿者/ shu (411回)-(2011/02/06(Sun) 23:35:26)
No56960 (miki さん) に返信

コンボボックスのアイテム用クラス:
        private class clsComboData
        {
            private string _KeyA;
            private string _KeyB;
            private string _Disp;

            public string KeyA
            {
                set
                {
                    _KeyA = value;
                }
                get
                {
                    return _KeyA;
                }
            }

            public string KeyB
            {
                set
                {
                    _KeyB = value;
                }
                get
                {
                    return _KeyB;
                }
            }

            public string Key
            {
                get
                {
                    return string.Format("{0}:{1}",_KeyA,_KeyB);
                }
            }

            public string Disp
            {
                set
                {
                    _Disp = value;
                }
                get
                {
                    return _Disp;
                }
            }
        }



コンボへのデータ設定処理:
            List<clsComboData> lst = new List<clsComboData>();
            lst.Add(new clsComboData() {KeyA = "A", KeyB = "1", Disp = "Disp1"});
            lst.Add(new clsComboData() {KeyA = "A", KeyB = "2", Disp = "Disp2"});
            lst.Add(new clsComboData() {KeyA = "B", KeyB = "1", Disp = "Disp3"});
            lst.Add(new clsComboData() {KeyA = "B", KeyB = "2", Disp = "Disp4"});

            comboBox1.DataSource = lst;
            comboBox1.ValueMember = "Key";
            comboBox1.DisplayMember = "Disp";


SelectedValueに設定する処理
            comboBox1.SelectedValue = string.Format("{0}:{1}", textBox1.Text, textBox2.Text);




この場合、コンボボックスのアイテムクラスでのValueMember用のプロパティで2つの項目を連結した文字列としているところが
ポイントです。その他の項目はDatarowをつかってもいいですし、他のクラスでもかまいません。



引用返信 編集キー/
■56970 / inTopicNo.3)  Re[2]: ComboBoxのValueMemberで複数フィールド
□投稿者/ todo (115回)-(2011/02/07(Mon) 15:02:32)
DataTable側にValueMember用の列を追加するとか。

DataTable.Columns.Add("ValueMember", typeof(string), "KeyA + ':' + KeyB");
引用返信 編集キー/
■56995 / inTopicNo.4)  Re[3]: ComboBoxのValueMemberで複数フィールド
□投稿者/ miki (7回)-(2011/02/08(Tue) 14:21:43)
お世話になります。

shuさん、todoさん
ヒントをいただき、ありがとうございました。
アドバイスを元に以下のように組み込みをしてみましたが、まだ正常に動作できておりません。


作成しているアプリはデータ編集用の画面で、画面上半分にデータ編集用のコントロールを配置し、カレントレコードを編集できるようにしています。画面下半分はデータグリッドでデータ一覧を表示しています。

データ編集用のコンボボックスに表示するデータはマスタテーブルから直接表示するようにしています。

○テーブル構成(テーブル名:mst)
ID1,ID2,名称  全てテキスト型のフィールド
主キー ID1,ID2 で構成

○コンボボックス設定
DataSource=select ID1 & '_' & ID2 as ID ,名称 from mst
DisplayMember=名称
ValueMember=ID


次に、コンボボックスを拡張したカスタムコントロールを作り、SelectedValueについて、2個のフィールドを
扱えるようにしてみました。

クラス:ComboEx
public string SelectedValue1
{
 get
 {
  string s = this.SelectedValue.ToString();
  string[] ss = s.Split('_');
  return ss[0];
 }
 set
 {
  this.SelectedValue = SelectedValue1 + "_" + SelectedValue2;
 }
}
public string SelectedValue2
{
 get
 {
  string s = this.SelectedValue.ToString();
  string[] ss = s.Split('_');
  return ss[1];
 }
 set
 {
  this.SelectedValue = SelectedValue1 + "_" + SelectedValue2;
 }
}


編集対象のテーブルは以下のような構成です。
○テーブル構成(テーブル名:dst)
ID1,ID2,ID3,名称  全てテキスト型のフィールド
主キー    ID1,ID2,ID3 で構成


上記テーブルをデータセットに格納して、m_BindingSourceのDataSourceに指定しています。
そして、コンボボックスコントロールに連結するため、

ctlComboEx.DataBindings.Add("SelectedValue1", m_BindingSource, "ID1");
ctlComboEx.DataBindings.Add("SelectedValue2", m_BindingSource, "ID2");

としました。

上記のような内容で、コンボックスからデータを変更したときには、ID1とID2のフィールドにデータが反映されるようになりました。
しかし、データグリッド上でカレントレコードを移動したとき、コンボボックスの内容が移動先のデータの内容に連動しません。その上、コンボボックスで選択されている値で、移動先のレコードの値も上書きされてしまいます。


データグリッド上でカレントレコードを移動したとき、SelectedValue1とSelectedValue2にID1、ID2の内容が逐次反映されていないためなのかと思います。
上記のような異常が発生している状況なのですが、何かよい解決方法、案はないでしょうか。

よろしくお願いします。


引用返信 編集キー/
■56997 / inTopicNo.5)  Re[4]: ComboBoxのValueMemberで複数フィールド
□投稿者/ todo (116回)-(2011/02/08(Tue) 14:50:03)
>  set
>  {
>   this.SelectedValue = SelectedValue1 + "_" + SelectedValue2;
>  }

ここが変です。
valueキーワードを使わないセッターはありえない。
引用返信 編集キー/
■56998 / inTopicNo.6)  Re[5]: ComboBoxのValueMemberで複数フィールド
□投稿者/ miki (8回)-(2011/02/08(Tue) 15:29:22)
todo さん
早速のチェック回答、ありがとうございました。

該当箇所について Valueに変更することで正常に動作するようになりました。
後は数値型など様々な型に対応できるよう、実装を拡張していきたいと思います。

大変助かりました。
ありがとうございましたm(__)m。

引用返信 編集キー/
■56999 / inTopicNo.7)  Re[6]: ComboBoxのValueMemberで複数フィールド
□投稿者/ miki (9回)-(2011/02/08(Tue) 15:29:59)
クローズします。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -