none
C#(2012) DataGridView上のDataGridViewComboBoxColumn RRS feed

  • 質問

  • データ表示に関してなのですが
    DataGridView上にデザイナでいくつかカラムを追加しました
    そのうち一つをコンボボックスにして、次のように設定しました

    カラム1
    型 DataGridViewTextBoxColumn
    DataPropertyName="size"
    カラム2
    型 DataGridViewComboBoxColumn
    DataPropertyName="weight"

    と設定し、
    /// <summary>
    /// コンボボックスのアイテム追加クラス
    /// </summary>
    /// <remarks>値:数値、表示値:文字</remarks>
    public class CmbKata
    {
    /// <summary>コンストラクタ</summary>
    /// <param name="iV">値</param>
    /// <param name="strD">表示値</param>
    public CmbKata(int iV, string strD)
    {
    Value = iV;
    DisplayName = strD;
    }
    /// <summary>値</summary>
    public int Value { get; private set; }
    /// <summary>表示値</summary>
    public string DisplayName { get; private set; }
    }

    /// <summary>重量のコンボボックス</summary>
    public static List<CmbKata> ItemWeight()
    {
    List<CmbKata> Dc = new List<CmbKata>();
    Dc.Add(new CmbKata(50, "50g です"));
    Dc.Add(new CmbKata(100, "100g です"));
    Dc.Add(new CmbKata(150, "150g です"));
    Dc.Add(new CmbKata(250, "250g です"));
    Dc.Add(new CmbKata(500, "500g です"));
    return Dc;
    }
    DataGridViewComboBoxColumn1.DataSource=ItemWeight();
    DataGridViewComboBoxColumn1.ValueMemver="Value";
    DataGridViewComboBoxColumn1.DisplayMember="DisplayName";
    と言うように、カラム2をコンボボックスから選べるようにしました

    ------------------------------------------------------------------

    データベースのテーブルには次のようなデータが入っているとします
    number|size|weight
    1|10|50
    2|20|100
    3|30|500
    と言うようなデータが入っているとします

    ------------------------------------------------------------------

    このデータベースは次の関数でデータセットに入ります(SELECT文でとってきてるだけです)
    public DataSet DataToruyo()
    {
        SQLiteDataAdapter da;
        DataSet ds = new DataSet();
        try {
            string strSql;

            strSql = "SELECT * FROM XXX...."
            da = new SQLiteDataAdapter(strSql, m_SQLCon);

            da.Fill(ds);
        } catch (Exception ex){
            ds = null;
        }
        return ds;
    }

    ------------------------------------------------------------------
    データベースのデータをグリッドビューに読み込む
    DataGridView1.DataSource=DataToruyo.table[0];
    ------------------------------------------------------------------
    以上のようにすると、
    カラム1は特に問題なく、[10/20/30]と言う数字が上から順番に表示されるのですが

    カラム2は [50g です/100g です/500g です ]と表示して欲しかったのですが、
    [50/100/500]がカラムに表示されてしまい、またその時にDataErrorイベントが毎回発生します
    コンボボックスにはValueMemberとDispalayMemberを設定すれば、
    正しい値を設定すれば、ValueMemberに結びついたDispalayMemberの文字列が表示されるかと思ったのですが、そのようになりません

    そこで質問なのですが
    1.カラム2の表示をデータベースから読み出した値に連動した文字列にするにはどのようなことをすればいいのか
    2.データベースのnumberと言う列の数字を、現在visible=falseのカラムを1列作り、そこに読み込ませて表示しないようにしているのです
      もうちょっとスマートな方法は無いでしょうか

    2013年10月9日 13:44

回答

  • 1.
    CmbKataクラスのValueはint型ですが、テーブルのweight列の型がint以外になっていませんか?
    一致していないとエラーになります。
    DataToruyo.table[0].Columns["weight"].DataTypeを見てみてください。

    2.
    DataGridViewにDataSourceをセットする前に、DataGridView.AutoGenerateColumnsプロパティをfalseに設定してやると、勝手に列を追加しないようになります。
    #デザイナに表示されないのでコードで設定する。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)


    • 編集済み gekkaMVP 2013年10月9日 15:00
    • 回答としてマーク いちろう 2013年10月9日 15:30
    2013年10月9日 14:57

すべての返信

  • 1.
    CmbKataクラスのValueはint型ですが、テーブルのweight列の型がint以外になっていませんか?
    一致していないとエラーになります。
    DataToruyo.table[0].Columns["weight"].DataTypeを見てみてください。

    2.
    DataGridViewにDataSourceをセットする前に、DataGridView.AutoGenerateColumnsプロパティをfalseに設定してやると、勝手に列を追加しないようになります。
    #デザイナに表示されないのでコードで設定する。


    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)


    • 編集済み gekkaMVP 2013年10月9日 15:00
    • 回答としてマーク いちろう 2013年10月9日 15:30
    2013年10月9日 14:57
  • ありがとうございます。

    1.データベースのデータ型がInt64になっていました・・・お恥ずかしい・・・
    型を一致されたらちゃんと表示されました

    2.AutoGenerateColumnsで成功しました

    非常に助かりました。本当にありがとうございます。

    2013年10月9日 15:29