🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

解決済

1回答

10193閲覧

DataGridViewComboBoxColumnでSelectIndexを行いたい

motmot

総合スコア5

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

0クリップ

投稿2021/02/25 09:08

前提・実現したいこと

現在C#の勉強中です。
ComboboxのコントロールにSelectIndexがあるのでそれと同じことをDatagridviewのコンボボックスでもやりたいのですがうまくいきません。
何かわかる方がいらっしゃったら教えてください。

イメージ説明

private void button1_Click(object sender, EventArgs e) { comboBox1.SelectedIndex = 1; }

試したこと

上記と同じようにbutton2を押したときに
イメージ説明
Combo2のコンボボックスを「yyy」にしたいのですがここで困ったことに
イメージ説明
comboBox1とは違ってSelectedIndex というものが設定できませんでした。

よく見てみるとcomboBox1はComboboxというクラスのものでCombo2はDataGridViewComboBoxColumnというクラスであることが分かったのですが、Combo2も同じようにSelectedIndex を設定したい場合はどうすればいいのでしょうか?

C#初心者のためその他何か必要な情報があれば追記しますので教えてください。

補足情報(FW/ツールのバージョンなど)

WindowsForm C#

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hey_CH

2021/02/25 13:53

試しに「C# DataGridView ComboBoxColumn SelectIndex」で検索したら https://loosecarrot.com/2018/07/05/41/ のような記事が出てきましたが、これではダメな感じですか?(未検証)
guest

回答1

0

ベストアンサー

DataGridViewのコンボボックスは、SelectedIndexを意識するより基本的にValueベースで扱うのがいいのではないかと思います。それでもどうしても取得したいという事であれば、DataGridViewComboBoxCellにSelectedIndexプロパティは無いので、相当のものを自分で作るしかないですね。
例えばこんなクラスを作って(あくまでサンプルです)

C#

1using System; 2using System.Data; 3using System.Windows.Forms; 4 5public static class DataGridViewExtension 6{ 7 public static int GetSelectedIndex(this DataGridViewCell cellOrig) 8 { 9 var cell = cellOrig as DataGridViewComboBoxCell; 10 if (cell == null) 11 { 12 return -1; 13 } 14 15 var dt = cell.DataSource as DataTable; 16 if (dt == null) 17 { 18 return -1; 19 } 20 21 var selectedRow = dt.Select($"{cell.ValueMember}='{cell.Value}'"); 22 if (selectedRow.Length == 0) 23 { 24 return -1; 25 } 26 return dt.Rows.IndexOf(selectedRow[0]); 27 } 28}

下記のような感じで使えます。

C#

1using System; 2using System.Data; 3using System.Windows.Forms; 4 5namespace WindowsFormsApp2 6{ 7 public partial class Form1 : Form 8 { 9 public Form1() 10 { 11 InitializeComponent(); 12 13 var dt = new DataTable(); 14 dt.Columns.Add("Col1"); 15 dt.Columns.Add("Col2", typeof(int)); 16 dt.Rows.Add("aaa", 100); 17 dt.Rows.Add("bbb", 200); 18 dt.Rows.Add("ccc", 300); 19 var colCombo = new DataGridViewComboBoxColumn(); 20 colCombo.DisplayMember = "Col1"; 21 colCombo.ValueMember = "Col2"; 22 colCombo.DataSource = dt; 23 dataGridView1.Columns.Add(colCombo); 24 } 25 26 private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) 27 { 28 var cell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex]; 29 MessageBox.Show($"Value={cell.Value} SelectedIndex={cell.GetSelectedIndex()}"); 30 } 31 } 32}

DataSourceがDataTable前提なので、違う場合は検索処理も変えてください。

投稿2021/02/25 11:52

編集2021/02/25 12:43
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問