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

DataGridで非表示列の内容を取得

環境/言語:[vb2003]
分類:[.NET]

お世話になっています。

DataGridにIDとTextを設定し、IDの列は非表示としてTextだけを通常見えるようにして
DataGridをダブルクリックすると、カレント行のIDを取得したいのですがどのように
したらいいのでしょうか?
※ID列は、列幅0とする非表示の方法以外でおねがいします。
 その他の列の幅はユーザーが自由に変更できるようにしたい為。
※DataGridは、ユーザーで並べ替えが可能。

Dim dt As DataTable
dt = New DataTable("DataTable1")
Dim dc As DataColumn
dc = New DataColumn("Column1", GetType(String))
dc.ColumnMapping = MappingType.Hidden
dt.Columns.Add(dc)
とすると非表示にはできたが、非表示にした列の内容が取得しようとすると、
「指定された引数は、有効な値の範囲内にありません。パラメータ名:columnIndex」
と表示される。
ふたつ気になったのですが、
・"Column1"ですが、これは"ID"の誤入力でしょうか?それとも単にテスト作成もしくは質問用のコードでしょうか?
・取得する際にどう記述してエラーになったかが分からないので無駄な質問になるかもしれませんが、
 データグリッドとデータテーブルの連携時につじつまを合わせてアクセスする場合、
 バインドを管理するクラスの仲介で行う必要がありますがその方法は採っているでしょうか。
    http://dobon.net/vb/dotnet/datagrid/currentrow.html

(
 とりあえず申し訳ないですが今は手元に2005しかないマシンの前なので2005でやってみたのですが、
 上のURLの方法まんまにて行を得て、そのカラムの値を取得できました。
)

(どのように記述した際にそのエラーが出たかを記述されると、回答側にも状況がわかると思います。)
お返事ありがとうございます。
すみません。コードの方はかなりはしおっていました。
多分、データ連携時のつじつま合わせがうまく行っていないと思います。

フォームにデータグリッドを貼り付け後、以下を実行すると
「指定された引数は、有効な値の範囲内にありません。」
と表示される。

Dim dt As New DataTable("Tbl") ' 表示用データ
' スタイルの設定
Dim ts As New DataGridTableStyle
ts.AlternatingBackColor() = Color.FromArgb(247, 247, 255)
ts.MappingName = "Tbl"
dt.DefaultView.AllowEdit = False
dt.DefaultView.AllowNew = False

' Text
dt.Columns.Add("Text", GetType(String))
Dim colTex As New DataGridTextBoxColumn
colTex.MappingName = "Text"
colTex.HeaderText = "Text"
colTex.Alignment = HorizontalAlignment.Center
colTex.Width = 200
ts.GridColumnStyles.Add(colTex)

' ID
Dim dc As DataColumn
dc = New DataColumn("ID", GetType(String))
dc.ColumnMapping = MappingType.Hidden
dt.Columns.Add(dc)

DataGrid.CaptionVisible = False
DataGrid.TableStyles.Add(ts)
DataGrid.DataSource = dt

' データ追加
Dim dr As DataRow
dr = dt.NewRow
dr("Text") = "データ1"
dr("ID") = "001"
dt.Rows.Add(dr)

' IDの取得
Dim c As DataGridCell
c = DataGrid.CurrentCell
MsgBox(DataGrid(c.RowNumber, 1))  ' ←エラー
グリッドとデータテーブルの行番号は一致するわけではないので、
上で示した、どぼんさんのページ(リンク先)にあるとおり、
グリッドのカレント行が連携している実際のカレント行にアクセスするには
Dim bm As BindingManagerBase = _
DataGrid1.BindingContext(DataGrid1.DataSource, DataGrid1.DataMember)
Dim drv As DataRowView = CType(bm.Current, DataRowView)
Dim dr As DataRow = drv.Row
Msgbox(dr("ID"))
みたいにします。
ありがとうございます。
DateGridに連携している行を取得するんですね、大変参考になりました。

 ところで、以前はフィールドを定義する際に幅を「0」に指定する
方法で行うと、実行時にデータグリッドの幅をドラッグで
列の幅が変更されていたような気ががしたのですが、今試してみたら
「0」の幅で定義した列は、変更できませんでした。
 仕様が変わったのか分かりませんが、やりたい方法が見つかって
大変助かりました。ありがとうございました。

' ID
dt.Columns.Add("ID", GetType(String))
Dim colID As New DataGridTextBoxColumn
colID.MappingName = "ID"
colID.Width = 0 ' ← ● ここ
ts.GridColumnStyles.Add(colID)
解決済み!

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