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

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

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

コンボボックスの SelectedValue を使うには

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■88794 / inTopicNo.1)  コンボボックスの SelectedValue を使うには
  
□投稿者/ 夜叉丸 (131回)-(2018/09/28(Fri) 11:12:41)

分類:[.NET 全般] 

2018/09/28(Fri) 11:28:18 編集(投稿者)

環境は
Windos 10
Sqlserver 2008 .Net 4.0
VisualStudio 2010 C# WinForm
です

NO INT, STR INT, END INT, NAME VARCHAR(50)
のデータテーブル(dt)があります。

comboBox1.DataSouce = dt;
comboBox1.DisplayMember = "NAME";
comboBox1.ValueMember = "NO";

にしました。

デバッグモードで
ComboBox.DataSouce を表示すると問題なく表示されています。

ところが、comboBox1.SelectedValue.ToString()
では 'System.Data.DataRowView' になります。

現在はしかたなく以下のようにしています。
string no = ((DataTable)comboBox1.DataSouce).Rows[comboBox1.SelectedIndex]["NO"].ToString();

どうすればSelectedValue で取得できるようになるのでしょうか?

ちなみにSQLのコードは
SELECT *
FROM TABLE
です。


引用返信 編集キー/
■88795 / inTopicNo.2)  Re[1]: コンボボックスの SelectedValue を使うには
□投稿者/ WebSurfer (1615回)-(2018/09/28(Fri) 11:23:18)
No88794 (夜叉丸 さん) に返信

何を作っているのですか(Windows Forms? その他?)

開発環境(OS, .NET, Visual Studio のバージョン、DB は何か)を書きましょう。
引用返信 編集キー/
■88796 / inTopicNo.3)  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;
  // :
 }
引用返信 編集キー/
■88797 / inTopicNo.4)  Re[2]: コンボボックスの SelectedValue を使うには
□投稿者/ 夜叉丸 (132回)-(2018/09/28(Fri) 13:05:41)
No88796 (魔界の仮面弁士 さん) に返信

>   dt.Rows.Add(100, 10, 30, "コンボボックスの");
このようなやり方があったんですね今まで
  DataRow drw = dt.NewRow();
  drw["NO"] = 100;
  drw["STR"] = 10;
  drw["END"] = 30;
  drw["NAME"] = "コンボボックスの";
  dt.Rows.Add(drw);
ってやってました。


魔界の仮面弁士 さん
どうもすみませんでした。
原因がわかりました。

コンボボックスの SelectedIndexChanged の処理で NO を取得しようとしているのですが

DataSource にデータを登録すると SelectedIndexChanged が発生します。
この段階で SelectedValue が取得できないみたいです。

なので以下のようにしました。

{
 bool flag = true;
 DataSource 設定
 flag = false;
 SelectedIndexChanged(null, null);
}

SelectedIndexChanged 
{
 if(flag) return;
}

このような変更方法でよいのでしょうか?





引用返信 編集キー/
■88798 / inTopicNo.5)  Re[3]: コンボボックスの SelectedValue を使うには
□投稿者/ PANG2 (233回)-(2018/09/28(Fri) 13:25:02)
No88797 (夜叉丸 さん) に返信
> DataSource にデータを登録すると SelectedIndexChanged が発生します。
> この段階で SelectedValue が取得できないみたいです。

ValueMemberが設定されていないから。

comboBox1.DisplayMember = "NAME";
comboBox1.ValueMember = "NO";
comboBox1.DataSource = dt;

にすると、

.SelectedIndex = -1
.SelectedValue = null

を取得するかな
引用返信 編集キー/
■88800 / inTopicNo.6)  Re[4]: コンボボックスの SelectedValue を使うには
□投稿者/ 夜叉丸 (133回)-(2018/09/28(Fri) 14:23:24)
No88798 (PANG2 さん) に返信
> ■No88797 (夜叉丸 さん) に返信
>>DataSource にデータを登録すると SelectedIndexChanged が発生します。
>>この段階で SelectedValue が取得できないみたいです。
>
> ValueMemberが設定されていないから。
>
> comboBox1.DisplayMember = "NAME";
> comboBox1.ValueMember = "NO";
> comboBox1.DataSource = dt;
>
> にすると、
>
> .SelectedIndex = -1
> .SelectedValue = null
>
> を取得するかな

なるほど・・・・
確かに逆にすると取得できるようになりました。

あと、DataTable を設定したとき(データあり)ですが
SelectedIndex = 0 になります。
-1にはなりません。

ありがとうございました。


解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ