質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.80%

DataGridViewのコンボボックスセルを動的に変更したい

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 7,895

G_chan

score 17

いつもお世話になっております。

C#でWindowsFormアプリケーションを作成しております。

取得したデータをDataGridViewに表示しています。取得したデータによってコンボボックスの中身を動的に変更したいです。

以下のプログラムでDataTableを作成し動的にコンボボックスをDataGridViewに追加することができましたが、DataGridViewComboBoxColumnのDataSourceが全行共通のDataSourceのためか(予想です)行ごとに変更ができませんでした。

            DataTable test = new DataTable("test");
            test.Columns.Add("Display", typeof(string));
            test.Columns.Add("Value", typeof(int));
            test.Rows.Add("A", 0);
            test.Rows.Add("B", 1);
            test.Rows.Add("C", 2);
            test.Rows.Add("D", 3);
            test.Rows.Add("E", 4);
            test.Rows.Add("F", 5);
            test.Rows.Add("G", 6);

            //DataGridViewComboBoxColumnを作成
            DataGridViewComboBoxColumn column = new DataGridViewComboBoxColumn();
            //DataGridViewComboBoxColumnのDataSourceを設定
            column.DataSource = test;
            //実際の値が"Value"列、表示するテキストが"Display"列とする
            column.ValueMember = "Value";
            column.DisplayMember = "Display";
            column.Name = "曜日";
            //DataGridView1に追加する
            dataGridView1.Columns.Add(column);

DataGridViewComboBoxColumn としているところを DataGridViewComboBoxCellにすることによって目的は果たせそうですが、どのようにしてコンボボックスのセルに設定するかがわからないです。

自分自身もよくわかっていないのでふわふわとした質問で申し訳ないのですが、よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • YAmaGNZ

    2019/04/24 23:09

    大元のDataGridViewに表示しているデータはどのように表示しているのですか?

    キャンセル

  • G_chan

    2019/04/25 12:57

    DataGridViewには以下のようにデータを表示させています。
    dataGridView1.Rows.Add(データ1,データ2);;

    同じように引数にDataSourceを指定するだけでComboBoxの中身が変更できるのが理想です。

    キャンセル

回答 3

+2

DataGridViewComboBoxCellにもDataSourceプロパティ、DisplayMemberプロパティ、ValueMemberプロパティがありますので、それを設定すれば、変更することが可能です。

DataGridViewComboBoxCellの取得の仕方としては、dataGridView1.Rows.Addで行を追加した後、該当のセルを取得すればよろしいかと

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

取得したデータによってコンボボックスの中身を動的に変更したいです。

具体的にどういうことがしたいのか分かりません。以下の記事のようなことでしょうか?

DataGridView に ComboBox を表示
http://surferonwww.info/BlogEngine/post/2014/01/23/how-to-show-combobox-column-in-datagridview.aspx

違う場合がはどこがどう違うかを書いてください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/04/24 21:08

    今回のデータ取得方法は自作のAPIにHTTPリクエストを送ることによってjsonで受け取っています。

    DataGridViewに「id」と「value」というカラムがあるとします。
    受っとった「id」が1であれば「value」には「A」、「B」が選択できるコンボボックス
    「id」が2であれば「value」には「C」、「D」が選択できるコンボボックスを用意したいです。

    また、コンボボックスにはDisplayMemberとDisiplayValueを設定し取得する値と見えている値を別にしたいです。

    教えていただいたURLは非常に有益な情報ではありましたが、すべての行で同じデータがコンボボックスに設定されているように見えますので今回やりたいこととは別な印象を受けました。
    すべて理解できているわけではないと思いますので解釈違いであればご指摘いただければ幸いです。

    キャンセル

  • 2019/04/24 22:26 編集

    > すべての行で同じデータがコンボボックスに設定されているように見えますので今回やりたいこととは別な印象を受けました。

    その通りです。そういう目的なので。

    DataGridView を使う目的は、DB のテーブルのレコード一覧を表示して、それをユーザーが編集し、編集結果で DB のテーブルを更新するということ以外は自分の頭にはありません。

    紹介した記事にも書きましたが、そこでの ComboBox の出番は、そのままでは数字で表示される列があってユーザーにとっては分かりにくいので、数字に代えて該当する名前を ComboBox を使用してドロップダウン形式で一覧を表示し、ユーザーがデーターベースを編集・更新する際に便宜を図るというものです。

    なので、行のデータによって ComboBox の中身を変えるというのは全くの想定外なのです。

    行のデータによって、ComboBox の中身を変えたいということのように思えますが、そういうことをしてどういう意味があるのか理解できません。できれば、そもそも何がしたいのか、そういうことをすることにより何ができるのかを説明していただけませんか。

    キャンセル

  • 2019/04/25 12:26

    具体的な話をだしてしまいますと、今回作成したいのはイベント(プログラム的なイベントではなく催事)スケジュールの登録です。スケジュールにはイベント名、場所、開始時間等の要素があります。

    今回行のデータによってComboBoxの中身を変えたいのは場所の要素です。イベントは同じ建物でも前回とは別のセミナー室だったりするパターンがあるからです。

    DBにはEventテーブルとRoomテーブルがあります。
    Eventテーブルにはどの建物で行うかの情報が「id」カラムに格納されちます。
    Roomテーブルには「id」カラムと部屋の名前である「room_name」カラムがあります。(カラム名とテーブル名は適当です。)

    Eventテーブルから取得した「id」によって表示するComboBoxの中身を変えたいというのが今回の内容です。

    すべての場所をComboBoxに表示してしまうと、そのイベントを行う建物には存在しない「room_name」が表示されるので矛盾が発生してしまいます。選択する人が気を付ければいいだけですが、今後イベントが増えることによって「room_name」が増えることを考えると選択するのも大変ですし、あまりスマートではないかなと感じました。

    プログラミングは定年退職してから始めたので開発経験がありません。
    こういった手法がそもそもオーソドックスなものなのかも判断がつきません。もしあまりよくない方法であればそれもご指摘いただければと思います。

    キャンセル

  • 2019/04/25 15:01

    せっかく説明いただいたのですが、何度読んでもどう考えてもやっていることが普通ではないように思えて意味が分かりません。お役に立てずすみませんが、他の方の回答をお待ちください。

    キャンセル

checkベストアンサー

0

DataGridViewとComboBoxを分けてみてはどうでしょうか?

DataGridViewは表示だけにして、入力は別で行うとComboBoxはそれぞれ1つずつで
内容を変更しても他に影響ありませんね。

任意の行に入力する方法については、他で調べるなりして
出来なければまた質問していただければいいと思います。

追記
ComboBoxの内容変更については、ケースごとにデータソースを変更すればいいかと思います。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る