DOBON.NET DOBON.NETプログラミング掲示板過去ログ

datagridviewのコンボボックスにデフォルト値を設定したい

環境/言語:[環境(WinVista) 使用言語(VisualStudio2008/C#)]
分類:[.NET]

お世話になります。C#のプログラミングで分からない部分が出てきましたので質問させてください。
宜しくお願いします。

【開発環境】WinVista/VisualStudio2008/C#

【やりたいこと】
データベース(MDB)を読んでdatagridview上に読み込んだデータを表示・更新する。
表示する項目の一部にコンボボックスの項目を設定している。

【確認したい内容】
単純にデータを表示することは出来ました。
コンボボックスの項目も初期表示時は空白ですが、ドロップダウンで値を選択することは可能です。
この状態の画面で、読み込んだデータの値によって、コンボボックスの項目にもデフォルト値を表示させたいと思っています。
色々とネットで検索してみましたが、コンボボックスの値をプログラム上から設定するものが見当たりませんでした。
通常のコンボボックスでは、listindexを設定する形になると思いますが、datagridviewのコンボボックスでは、どのようなやり方になるのでしょうか?

datagridviewを定義している部分のPGを載せておきます。
//--- ComboBox Column
cmd.CommandText = string.Concat("SELECT DISTINCT NAME, K_ID FROM ○○台帳 WHERE F_DIST = '1' ORDER BY K_ID");
cn.Open();
DataGridViewComboBoxColumn pCmbColumn3 = new DataGridViewComboBoxColumn();
pCmbColumn3.DataPropertyName = "Col_2";
pCmbColumn3.HeaderText = "所有者";
DataTable kousakusyaTable = new DataTable("shoyusyaTable");
shoyusyaTable.Columns.Add("Display", typeof(string));
shoyusyaTable.Columns.Add("Value", typeof(string));
pCmbColumn3.DisplayMember = "Display";
pCmbColumn3.ValueMember = "Value";
shoyusyaTable.Rows.Add("", "");
using (System.Data.OleDb.OleDbDataReader reader3 = cmd.ExecuteReader())
{
  while (reader3.Read())
  {
    shoyusyaTable.Rows.Add(reader3[0].ToString(), reader3[1].ToString());
  }
}
cn.Close();
pCmbColumn3.DataSource = shoyusyaTable;
this.dataGridView1.Columns.Add(pCmbColumn3);
//--- Col_1
this.dataGridView1.Columns[0].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
this.dataGridView1.Columns[0].Width = 70;
this.dataGridView1.Columns[0].SortMode = DataGridViewColumnSortMode.NotSortable;
this.dataGridView1.Columns[0].ReadOnly = true;
this.dataGridView1.Columns[0].DefaultCellStyle.BackColor = Color.LightGray;
//--- Col_2
this.dataGridView1.Columns[1].HeaderCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
this.dataGridView1.Columns[1].Width = 100;
this.dataGridView1.Columns[1].SortMode = DataGridViewColumnSortMode.NotSortable;
this.dataGridView1.Columns[1].ReadOnly = false;
デフォルト値ですか。

カラム1とカラム2があって、カラム1にDBで取得した値を表示させ、その値でカラム2(コンボ)に対して何らかのデフォルトの値を設定したいってことでしょうか?

それとも単純にDBからの取得値をコンボに反映表示でいいのかな?
黒犬様、お世話になります。

■No26295に返信(黒犬さんの記事)
> デフォルト値ですか。
>
> カラム1とカラム2があって、カラム1にDBで取得した値を表示させ、その値でカラム2(コンボ)に対して何らかのデフォルトの値を設定したいってことでしょうか?
>
> それとも単純にDBからの取得値をコンボに反映表示でいいのかな?

やりたいことは後者の方です。
例えば、土地のDBからコードと所有者名を取ってきて、所有者名は、予め定義していたコンボボックス内のデータ位置で表示させる。
所有者名がなければ、コンボボックスは空白のままで表示させる。
と言うような動きです。
これで分かるでしょうか?
昔やった記憶では、DataGridViewの行追加(だったか)のイベントでコンボボックスに値を設定する、だったような。

事務所に戻ればソースがあるんですが出先なもので役に立てずに申し訳ないです。
■No26299に返信(黒犬さんの記事)
> 昔やった記憶では、DataGridViewの行追加(だったか)のイベントでコンボボックスに値を設定する、だったような。
>
> 事務所に戻ればソースがあるんですが出先なもので役に立てずに申し訳ないです。
>
お手間を取らせてすいません。
今やっているロジックは、DataGridViewに行を追加しながらコンボボックスのカラムで該当するリスト位置にデータを表示させたいと言うものです。

例えば、
コンボボックスのリストに、「空白」「あああ」「いいい」「ううう」が定義されていて、読み込んだデータが「あああ」の場合、コンボボックスの「あああ」が表示された状態にしたいと思っています。
これが分かるとDataGridViewの使い勝手が良くなるので助かるのですが。
行を追加しながらなら、コンボボックスをDataSourceをBindさせた後で、

ドロップダウンリスト.SelectedIndex = ドロップダウンリスト.FindStringExact(DBから取得した文字列)

でいけませんか?

FindStringExactは下記を参照して下さい。
http://msdn.microsoft.com/ja-jp/library/microsoft.clradmin.datagridcombobox.findstringexact.aspx


もしくは、このサイトの「DataGridでComboBoxを使う」の「public class DataGridComboBox」辺りを参考に考えてみてはどうでしょう。
■No26305に返信(熊さんの記事)
> コンボボックスのリストに、「空白」「あああ」「いいい」「ううう」が定義されていて、読み込んだデータが「あああ」の場合、コンボボックスの「あああ」が表示された状態にしたいと思っています。

意図を理解しきれているか自信がありませんが…これでどうでしょう。

DataTable tbl1;
DataGridView dgv1;
DataGridViewTextBoxColumn col1;
DataGridViewComboBoxColumn col2;
DataGridViewTextBoxColumn col3;
private void Form1_Load(object sender, EventArgs e)
{
    tbl1 = new DataTable();
    tbl1.PrimaryKey = new DataColumn[] { tbl1.Columns.Add("コード", typeof(int)) };
    tbl1.Columns.Add("所有者名");
    tbl1.Rows.Add(1, "あああ");
    tbl1.Rows.Add(2, "存在しない値");
    tbl1.Rows.Add(3, "いいい");
    tbl1.AcceptChanges();

    dgv1 = new DataGridView();
    dgv1.AutoGenerateColumns = false;
    dgv1.Dock = DockStyle.Fill;

    col1 = new DataGridViewTextBoxColumn();
    col2 = new DataGridViewComboBoxColumn();
    col3 = new DataGridViewTextBoxColumn();

    col1.DataPropertyName = "コード";
    col2.DataPropertyName = "所有者名";
    col3.DataPropertyName = "所有者名"; // 確認用

    col2.DataSource = ",あああ,いいい,ううう".Split(',');
    col2.DisplayStyle = DataGridViewComboBoxDisplayStyle.Nothing;

    dgv1.EditMode = DataGridViewEditMode.EditOnEnter;
    dgv1.DataError += delegate(object o, DataGridViewDataErrorEventArgs arg)
    {
        arg.ThrowException = false;
    };

    dgv1.Columns.AddRange(col1, col2,col3);
    dgv1.DataSource = tbl1;
    Controls.Add(dgv1);
}
ありがとうございます。
HP参考にして確認してみます。
魔界の仮面弁士様、ありがとうございます。

コードを使わせて頂いたら、期待した結果が出ました。
ただ、内容をまだ理解できていないので、もう少し調べて、理解したいと思います。
返信が遅くなってしまいました。
魔界の仮面弁士様に教えて頂いたコードの中の
dgv1.DataSource = tbl1;

dgv1.Rows.Add(1, "あああ");
dgv1.Rows.Add(2, "存在しない値");
dgv1.Rows.Add(3, "いいい");
に変更して、期待した結果を得ることが出来ました。
お二人とも、ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板