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

DataViewとDataGridの関係について

環境/言語:[WindowsXP、VB.NET、.NET Framework1.0]
分類:[.NET]

いつもお世話になっています。
2回目の投稿であり、VBビギナーです。
よろしくお願いいたします。

ComboBoxとDataGridを使用して、データベースからのレコードを条件により
抽出して表示させようとしています。

ComboBox1にはログイン名(Environment.Username)に応じたデータ(「部署」
というフィールド名)をデータソースに設定しています。
ComboBox1の選択肢を選択すると、その選択肢(「部署」)の人名などのレコードが
DataGridへ表示されるという仕組みです。
以下のようにコードを記述いたしました。


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'@/////ComboBox1へログインユーザーにより、閲覧可能な部署を制限し表示
Dim dView As DataView
Me.ComboBox1.Items.Clear()
Me.OleDbDataAdapter1.Fill(Me.DataSet部署, "tbl_NI")
dView = New DataView(Me.DataSetB.Tables("tbl_NI"), _
"ユーザー名 LIKE '*" & Environment.UserName & "*'" _
, "", DataViewRowState.CurrentRows)

'コンボボックスにtbl_NIテーブルを連結する
ComboBox1.DataSource = dView

'コンボボックスに部署名を表示できるように設定する
Me.ComboBox1.DisplayMember = "部署名"

'備考に対応した部署名を SelectdValue で取得できるように設定する
Me.ComboBox1.ValueMember = "部署名"

'A/////DataGrid1へ氏名などを表示
Dim cStyle(10) As DataGridColumnStyle
Dim tStyle As DataGridTableStyle

tStyle = New DataGridTableStyle()
tStyle.MappingName = "table_人事"
DataGrid1.TableStyles.Add(tStyle)

cStyle(0) = New DataGridTextBoxColumn()
cStyle(0).HeaderText = "社員番号"
cStyle(0).MappingName = "社員番号"
cStyle(0).Width = 60
tStyle.GridColumnStyles.Add(cStyle(0))

cStyle(1) = New DataGridTextBoxColumn()
cStyle(1).HeaderText = "氏名"
cStyle(1).MappingName = "氏名"
cStyle(1).Width = 90
tStyle.GridColumnStyles.Add(cStyle(1))

cStyle(2) = New DataGridTextBoxColumn()
cStyle(2).HeaderText = "所属"
cStyle(2).MappingName = "所属"
cStyle(2).Width = 0
tStyle.GridColumnStyles.Add(cStyle(2))
End Sub

Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged

Me.OleDbDataAdapter2.Fill(DataSet人事, "table_J")
'所属にてデータビューを絞り込む
DataGrid1.TableStyles.Clear()
DataSet人事.Clear()
Dim dView2 As DataView
dView2 = New DataView(DataSet人事.Tables("table_J"), "所属
    LIKE '*" & CType(CType(Me.ComboBox1.SelectedValue,
    DataRowView).Item(0), String) & "*'", _
"", DataViewRowState.CurrentRows)

'DataGridに関連付けて表示する
DataGrid1.DataSource = dView2

End Sub


このように記述すると、デバッグ時にエラーが発生します。

エラー行:tStyle.GridColumnStyles.Add(cStyle(0))

エラー内容:
'System.ArgumentException' のハンドルされていない例外が system.windows.forms.dll で発生しました。
追加情報 : データ グリッドの列スタイル コレクションには、既に同じマップ名の列スタイルが含まれています。


DataGrid表示を工夫するために、DataGridTableStyleやDataGridColumnStyleを
使用しているだけなのですが、今回はエラーが発生します。
いろいろ考えたのですが、行き詰ってしまいました。
大変恐縮ですが、エラーの原因をどなたか教えていただけないでしょうか。
よろしくお願いいたします。
お世話になります。

■No18598に返信(aikouさんの記事)
> エラー内容:
> 'System.ArgumentException' のハンドルされていない例外が system.windows.forms.dll で発生しました。
> 追加情報 : データ グリッドの列スタイル コレクションには、既に同じマップ名の列スタイルが含まれています。

実験的に以下のコードを作ってみたのですが、
======================================================
Dim dt As DataTable = New DataTable("test_tablename")
dt.Columns.Add("Column1", GetType(String))
dt.Rows.Add(New String() {"A"})
dt.Rows.Add(New String() {"B"})
dt.Rows.Add(New String() {"C"})

Dim tbStyle As DataGridTableStyle = New DataGridTableStyle
tbStyle.MappingName = dt.TableName
Me.DataGrid1.TableStyles.Clear()
Me.DataGrid1.TableStyles.Add(tbStyle)

Dim colStyle As DataGridColumnStyle
colStyle = New DataGridTextBoxColumn()
colStyle.MappingName = "Column1"
tbStyle.GridColumnStyles.Add(colStyle)

Dim testStyle As DataGridTextBoxColumn = New DataGridTextBoxColumn
testStyle.MappingName = "Column1" ' 同じ名前で Add
tbStyle.GridColumnStyles.Add(testStyle) ' ここで ArgumentException が発生する。
======================================================
DataGridTableStyle オブジェクトの GridColumnStyles に
同じ MappingName の ものを Add すると上記例外が発生します。

なので、同じ MappingName を使用していないか確認する事や、
ステップ実行して DataGridTableStyle オブジェクトの GridColumnStyles
の中身を ウォッチなどで見てみると原因がつかめると思います。

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