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前提なので、違う場合は検索処理も変えてください。