|
■No88794 (夜叉丸 さん) に返信 > comboBox1.DataSouce = dt; > comboBox1.DisplayMember = "NAME"; > comboBox1.ValueMember = "NO"; > にしました。 > > デバッグモードで > ComboBox.DataSouce を表示すると問題なく表示されています。 > > 現在はしかたなく以下のようにしています。 > string no = ((DataTable)comboBox1.DataSouce).Rows[comboBox1.SelectedIndex]["NO"].ToString();
上記すべて DataSouce という表記が使われていますが おそらくは DataSource の事ですよね?
> ところが、comboBox1.SelectedValue.ToString() > では 'System.Data.DataRowView' になります。
ValueMember で指定されたメンバーにバインドできなかった場合、 そのような状態になります。
たとえば、上記を実行した時点で、DataSource に別のインスタンスが渡されており、 そこに "NO" 列が無かったというケース。
あるいは、ValueMember が null になっていたなどというものです。
> NO INT, STR INT, END INT, NAME VARCHAR(50) > のデータテーブル(dt)があります。
VARCHAR(50) はデータベース側の話ですね。
DataTable の各列は .NET にとっての型になるので、 たとえば、こんな感じで良いでしょうか。
private void Form1_Load(object sender, EventArgs e) { dt = new DataTable("TBL") { CaseSensitive = true }; dt.Columns.Add("NO", typeof(int)); dt.Columns.Add("STR", typeof(int)); dt.Columns.Add("END", typeof(int)); dt.Columns.Add("NAME", typeof(string)).MaxLength = 50; dt.Rows.Add(100, 10, 30, "コンボボックスの"); dt.Rows.Add(200, 20, 40, "SelectedValue"); dt.Rows.Add(300, 30, 50, "を使うには"); dt.AcceptChanges(); //comboBox1.DataSouce = dt; comboBox1.DataSource = dt; comboBox1.DisplayMember = "NAME"; comboBox1.ValueMember = "NO"; }
> では 'System.Data.DataRowView' になります。 DataRowView から拾う場合は、こうなるはずですね。
DataRowView rowView = (DataRowView)comboBox1.SelectedItem; if (rowView != null) { DataRow row = rowView.Row; int no = row.Field<int?>("NO") ?? -1; // : }
|