C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 153 を表示中)
■88796 / )  Re[1]: コンボボックスの SelectedValue を使うには
□投稿者/ 魔界の仮面弁士 (1866回)-(2018/09/28(Fri) 11:37:11)
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;
  // :
 }
返信 編集キー/


管理者用

- Child Tree -