DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Combobox.Displaymember値のリセットについて

環境/言語:[環境 XP:使用言語 VB.NET]
分類:[.NET]

お世話になっております。

いつもはこちらの掲示板を閲覧することで解決してしまうのですが、
今回は残念ながらヒントになりそうな記事が見つかりませんでした。

現在
WindowsXP:VisualStudio2005:VB.NET

Combobox(cbx)へDataTable(dt)のデータを表示する処理を作成しています。

dim dt as New DataTable
dim col as New DataColumn("EDITLINE")

dt = dtX.copy (dtXはColumn"VALUE1","VALUE2"をもつDataTableです)
dt.Columns.Add(col)
col.Expression = "VALUE1 + ':' + VALUE2"

cbx.DisplayMember = col.ColumnName   ・・・(1)
cbx.ValueMember = "VALUE1" ・・・(2)
cbx.DataSource = dt           ・・・(3)

とした場合に
(3)処理後にcbx.DisplayMemberプロパティがブランクになってしまいました。
もちろんComboboxに表示されているデータも"System.Data.DataRowView"になってしまっています。

Expressionが原因かと思い、SQLで取得する時点で文字列結合をしてみましたが、
やはりDisplayMemberプロパティがブランクに設定されてしまいました。

同様の処理をListBoxへ出力する方法を試しましたが、こちらはうまくいきました。

解説が掲載されている場所等をご存知の方、いらっしゃいましたらご教授願います。
■No28900に返信(すもけさんの記事)

  Dim dtX As New DataTable
  Dim dt As DataTable
  Dim col As New DataColumn("EDITLINE")
  dtX.Columns.Add("VALUE1")
  dtX.Columns.Add("VALUE2")
  dtX.Rows.Add("a1", "b1")
  dtX.Rows.Add("a2", "b2")
  dtX.Rows.Add("a3", "b3")
  dtX.Rows.Add("a4", "b4")
  dt = dtX.Copy()
  dt.Columns.Add(col)
  col.Expression = "VALUE1 + ':' + VALUE2"

  ComboBox1.DisplayMember = col.ColumnName
  ComboBox1.ValueMember = "VALUE1"
  ComboBox1.DataSource = dt

これと同等の処理ですよね?
特に問題なく動くのですが、どこか違いますか?
こんばんは。
うちの環境ではそのまま書いても問題なく動作します。
Windows XP professional SP3にて、VisualStudio2005(.NET2.0用)と2008(.NET3.5用を指定)を使用。言語はVB。

もし上記が「実際のコード」と異なる「例示用のコード」でしたら、
実際のコードの方でこれと異なる何かをどこかでしていないか確認してみてください。
可能性が高いものとしては…実際のコードの方での(3)に相当する部分で、
元の方のDataTable(dtx)等、つまり「EDITLINE」列がないDataTableを指定してしまっていると、
そのような症状が発生すると思います。

※以下は実際に動作したものです。
────────────────────
Dim dtx As New DataTable
dtx.Columns.Add("VALUE1", GetType(String))
dtx.Columns.Add("VALUE2", GetType(String))
Dim rw As DataRow
rw = dtx.NewRow() : rw("VALUE1") = "1" : rw("VALUE2") = "11111" : dtx.Rows.Add(rw)
rw = dtx.NewRow() : rw("VALUE1") = "2" : rw("VALUE2") = "222" : dtx.Rows.Add(rw)


Dim dt As New DataTable
Dim col As New DataColumn("EDITLINE")

dt = dtx.Copy
dt.Columns.Add(col)
col.Expression = "VALUE1 + ':' + VALUE2"

ComboBox1.DisplayMember = col.ColumnName
ComboBox1.ValueMember = "VALUE1"
ComboBox1.DataSource = dt
shuさん
とん。さん
返信ありがとうございます。

自己解決いたしましたのでご報告いたします。

こちらへ投稿した後、さらに以下のことを試してみました。
 1)DisplayMemberの指定をDataSource設定後に変更 → OK
 2)同一フォームへ別のComboBox(cbxB)を作成し、そちらへ同じ要領で設定 → OK

1)でDataTable等の内容が正常であることは確認できたと思われましたので、
2)で作成したComboBox(cbxB)と異常が発生するComboBox(cbxA)のプロパティを確認したところ
「Sorted」プロパティがcbxA→True、cbxB→Falseになっていました。
これらからcbxBのプロパティをTrueへ変更し再度実行したところ、DisplayMemberがリセットされました。

cbxAのプロパティをFalseへ変更しプログラムを作成することにいたしました。
ですが根本解決まではいたっていません。今後Sortedプロパティについて調査してみようとは思いますが、なにか解説等ありましたらご教授願います。
(一応「解決済み!」とさせていただきます)
解決済み!
2011/08/18(Thu) 10:47:00 編集(投稿者)

■No28904に返信(すもけさんの記事)

直接的な解決方法ではありませんが
Sortedが原因ならSortedはFalseにしておいて
DataSourceにDataViewをSortして設定するかDefaultViewに対しSortする
といいんじゃないかな?

ComboBox1.DisplayMember = col.ColumnName
ComboBox1.ValueMember = "VALUE1"
Dim vw as new DataView(dt)
vw.Sort = "VALUE1"
ComboBox1.DataSource = vw

または

ComboBox1.DisplayMember = col.ColumnName
ComboBox1.ValueMember = "VALUE1"
Dim vw = dt.DefaultView
vw.Sort = "VALUE1"
ComboBox1.DataSource = dt
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板