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

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

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

Re[5]: datagridviewコンボのDisplayMember


(過去ログ 19 を表示中)

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

■7855 / inTopicNo.1)  datagridviewコンボのDisplayMember
  
□投稿者/ ぼん (1回)-(2007/09/18(Tue) 10:53:50)

分類:[C#] 

こんにちは。
datagridviewにデータベースからデータをバインドして、「CLTKBN」というフィールドを取得、
それをコンボボックスに区分として表示したいというものを作りたいのです。
以下のコードを書いてみたのですが、DisplayMember ではなくValueMember の値がコンボボックスに出てしまっています。
選ぶ時は「%」「円」「倍率」の3つから選び、選んだらそれを表示、実際の値は「0」「1」「2」としたいのです。
データベースから区分を読み込んだ時も数字が出てしまっています。
(コンボボックスをクリックした時だけ「%」等が表示されて、決定するとまた数字に戻る)

DataTable CLTTable = new DataTable("K_CLT");
CLTTable.Columns.Add("CLTN", typeof(string));
CLTTable.Columns.Add("CLTK", typeof(int));


CLTTable.Rows.Add("%",0);
CLTTable.Rows.Add("円", 1);
CLTTable.Rows.Add("倍率", 2);

//列にバインドされているデータを設定する
cboCLT.DataPropertyName = "CLTKBN";
//DataGridViewComboBoxColumnのDataSourceを設定
cboCLT.DataSource = CLTTable;

//実際の値が"CLTK"列、表示するテキストが"CLTN"列とする
cboCLT.ValueMember = "CLTK";
cboCLT.DisplayMember = "CLTN";

以上です。
何かご不明な点があればお聞きください。
よろしくお願いいたします。
引用返信 編集キー/
■7862 / inTopicNo.2)  Re[1]: datagridviewコンボのDisplayMember
□投稿者/ 魔界の仮面弁士 (428回)-(2007/09/18(Tue) 12:35:54)
No7855 (ぼん さん) に返信
> 以下のコードを書いてみたのですが、DisplayMember ではなくValueMember の値がコンボボックスに出てしまっています。

そのまま試してみましたが、特に問題なく表示されましたけれども…。
どこか他の部分に問題があったりはしませんか?


using System;
using System.Data;
using System.Windows.Forms;

public class SampleForm : Form
{
    [STAThread]
    static void Main()
    {
        //Application.EnableVisualStyles();
        Application.Run(new SampleForm());
    }

    DataTable sampleData;
    DataTable CLTTable;
    DataGridView dgv;
    SampleForm()
    {
        // コンボボックス列のデータ
        CLTTable = new DataTable("K_CLT");

        CLTTable.Columns.Add("CLTN", typeof(string));
        CLTTable.Columns.Add("CLTK", typeof(int));

        CLTTable.Rows.Add("%", 0);
        CLTTable.Rows.Add("円", 1);
        CLTTable.Rows.Add("倍率", 2);


        // データ本体
        sampleData = new DataTable("Sample");
        sampleData.Columns.Add("ID", typeof(int));
        sampleData.Columns.Add("CLTKBN", typeof(int));

        sampleData.Rows.Add(1, 0);
        sampleData.Rows.Add(2, 1);
        sampleData.Rows.Add(3, 2);
        sampleData.Rows.Add(4, 0);
        sampleData.Rows.Add(5, 1);
        sampleData.Rows.Add(6, 2);


        // DataGridView への手動割当
        DataGridViewTextBoxColumn txtID = new DataGridViewTextBoxColumn();
        txtID.DataPropertyName = "ID";
        txtID.ReadOnly = true;
        txtID.HeaderText = "ID";

        DataGridViewTextBoxColumn txtCLT = new DataGridViewTextBoxColumn();
        txtCLT.DataPropertyName = "CLTKBN";
        txtCLT.HeaderText = "名";

        DataGridViewComboBoxColumn cboCLT = new DataGridViewComboBoxColumn();
        cboCLT.DataPropertyName = "CLTKBN";
        cboCLT.HeaderText = "値";
        cboCLT.DataSource = CLTTable;
        cboCLT.ValueMember = "CLTK";
        cboCLT.DisplayMember = "CLTN";

        dgv = new DataGridView();
        dgv.EditMode = DataGridViewEditMode.EditOnEnter;
        dgv.Dock = DockStyle.Fill;
        dgv.Columns.Add(txtID);
        dgv.Columns.Add(cboCLT);
        dgv.Columns.Add(txtCLT);
        dgv.AllowUserToAddRows = false;

        dgv.Columns[txtID.Index].Width = 60;
        dgv.Columns[cboCLT.Index].Width = 60;
        dgv.Columns[txtCLT.Index].Width = 60;

        DataGridViewCellStyle style = dgv.DefaultCellStyle;
        style.SelectionBackColor = style.BackColor;
        style.SelectionForeColor = style.ForeColor;

        dgv.DataSource = sampleData;

        dgv.DataError += delegate(Object o, DataGridViewDataErrorEventArgs a) { a.Cancel = true; };

        Controls.Add(dgv);
    }
}

引用返信 編集キー/
■7872 / inTopicNo.3)  Re[2]: datagridviewコンボのDisplayMember
□投稿者/ ぼん (2回)-(2007/09/18(Tue) 15:28:09)
No7862 (魔界の仮面弁士 さん) に返信
> そのまま試してみましたが、特に問題なく表示されましたけれども…。
> どこか他の部分に問題があったりはしませんか?

返信ありがとうございます。
datatableをコードで直接用意してdatagridviewのDataSourceに格納すると思い通りの動きをしました。
ですが、ODP.NETにてデータベースと接続してデータバインドするとまた元にもどってしまいました。
以下ソースです。

OracleConnection conn = new OracleConnection();
conn.ConnectionString = "***********";
OracleCommand cmd = conn.CreateCommand();
string sqlStr = "SELECT * FROM TABLE1";
cmd.CommandText = sqlStr;
conn.Open();
this.da = new OracleDataAdapter(cmd);
this.da.Fill(this.ds, "TABLE1");
this.bindS.DataSource = this.ds;
this.bindS.DataMember = "TABLE1";
datBTO.DataSource = this.bindS;

このような感じです。
datBTOがDataGridviewになります。
bindSはBindingSourceです。
どこかおかしい所がありますでしょうか・・・・・
TABLE1の中に「CLTKBN」が含まれており、1桁のNUMBER型です。
引用返信 編集キー/
■7886 / inTopicNo.4)  Re[3]: datagridviewコンボのDisplayMember
□投稿者/ 魔界の仮面弁士 (429回)-(2007/09/18(Tue) 18:15:04)
No7872 (ぼん さん) に返信
> TABLE1の中に「CLTKBN」が含まれており、1桁のNUMBER型です。

NUMBER 型というのは、Oracle の世界の型ですよね。

ODP.NET の世界では、Oracle.DataAccess.Types.OracleDecimal という型ですし、
DataTable などに格納されるときは、また別の型にマッピングするかと思います。

最終的に DataTable 内に格納する際、DataColumn の列を何型にマッピングさせていますか?

Int32 型にマッピングされているなら、
 CLTTable.Columns.Add("CLTK", typeof(int));
ですし、Byte 型にマッピングされているなら、
 CLTTable.Columns.Add("CLTK", typeof(byte));
ですし、Decimal 型にマッピングされているなら、
 CLTTable.Columns.Add("CLTK", typeof(decimal));
にする必要があるのでは無いでしょうか。
引用返信 編集キー/
■7922 / inTopicNo.5)  Re[4]: datagridviewコンボのDisplayMember
□投稿者/ ぼん (3回)-(2007/09/19(Wed) 17:53:29)
No7886 (魔界の仮面弁士 さん) に返信
> ODP.NET の世界では、Oracle.DataAccess.Types.OracleDecimal という型ですし、
> DataTable などに格納されるときは、また別の型にマッピングするかと思います。
>
> 最終的に DataTable 内に格納する際、DataColumn の列を何型にマッピングさせていますか?
>
> Int32 型にマッピングされているなら、
>  CLTTable.Columns.Add("CLTK", typeof(int));
> ですし、Byte 型にマッピングされているなら、
>  CLTTable.Columns.Add("CLTK", typeof(byte));
> ですし、Decimal 型にマッピングされているなら、
>  CLTTable.Columns.Add("CLTK", typeof(decimal));
> にする必要があるのでは無いでしょうか。

魔界の仮面弁士 さんありがとうございます。
返信遅くなりすみません。
Decimalにしてみたりいろいろしてみたのですが、なかなかうまくいかず苦戦しております。
もう少し試してみたら経過を報告いたします。

よろしくお願いいたします。
引用返信 編集キー/
■7933 / inTopicNo.6)  Re[5]: datagridviewコンボのDisplayMember
□投稿者/ ぼん (4回)-(2007/09/20(Thu) 11:10:08)
> ■No7886 (魔界の仮面弁士 さん) に返信
>>ODP.NET の世界では、Oracle.DataAccess.Types.OracleDecimal という型ですし、
>>DataTable などに格納されるときは、また別の型にマッピングするかと思います。
>>
>>最終的に DataTable 内に格納する際、DataColumn の列を何型にマッピングさせていますか?
>>
>>Int32 型にマッピングされているなら、
>> CLTTable.Columns.Add("CLTK", typeof(int));
>>ですし、Byte 型にマッピングされているなら、
>> CLTTable.Columns.Add("CLTK", typeof(byte));
>>ですし、Decimal 型にマッピングされているなら、
>> CLTTable.Columns.Add("CLTK", typeof(decimal));
>>にする必要があるのでは無いでしょうか。

魔界の仮面弁士 さんありがとうございます。
型をあわせたところ、無事思ったとおりの動きになりました。
C#はまだ使い始めたばかりでしたので、ちょっと戸惑ってしまいました・・・・

また何かありましたら質問させていただきます。
ありがとうございました!
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -