@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

DataGridViewにカーソルの位置付をしたい

1
投稿者投稿内容
chiroru
ベテラン
会議室デビュー日: 2008/10/02
投稿数: 59
投稿日時: 2009-02-04 10:01
言語:Microsoft Visual Studio 2008
データベース:SQL Server 2005 非接続型のデータアクセス

現在、簡単なマスタメンテナンス画面を作成しています。
フォーム1のDataGridViewにTableAdapterを使ってデータを表示し、
フォーム2にフォーム1で選択されたデータの変更処理ができるようになっています。
(追加/修正/削除)
そこで質問なんですが、フォーム2でデータの変更処理が行われた後、
フォーム1に戻りDataGridViewを再表示するのですが、
その時、修正対象となったデータにカーソルの位置付をするにはどうすればよいですか?
下記のようにコーディングしたのですが、うまくいきません。
よろしくお願いします。

Dim sqlDA As SqlDataAdapter = New SqlDataAdapter()
sqlDA.MissingSchemaAction = MissingSchemaAction.AddWithKey
Dim ds As DataSet = New DataSet()
sqlDA.SelectCommand = New SqlCommand()
If intkubun = 3 Then ’削除の場合
strsql = "SELECT TOP 1 CD FROM T_MAST WHERE (CD < '" & strCD & "') ORDER BY CD DESC"
Else ’追加、修正の場合
strsql = "SELECT TOP 1 CD FROM T_MAST WHERE (CD = '" & strCD & "')"
End If
sqlDA.SelectCommand.CommandType = CommandType.Text
sqlDA.SelectCommand.CommandText = strsql
sqlDA.SelectCommand.Connection = New SqlConnection(My.Settings.MyAppConnect)
sqlDA.Fill(ds, "MAST")
If ds.Tables("MAST").Rows.Count > 0 Then
strKye = ds.Tables("MAST").Rows(0).Item("CD").ToString()
End If
' DataTable 内のデータ行取得
Dim findRow As DataRow = ds.Tables("MAST").Rows.Find(strKye)
' カーソルの位置付け
For Each dgvRow As DataGridViewRow In .dgvList.Rows
Dim row As DataRow = DirectCast(dgvRow.DataBoundItem, DataRowView).Row
If row Is findRow Then
dgvRow.Selected = True
Exit For
End If
Next
' 選択されている行を取得
For Each r As DataGridViewRow In .dgvList.SelectedRows
.dgvList.CurrentCell = .dgvList.Rows(r.Index).Cells(0)
Next r
' 現在表示されている最初のセルを左上隅に設定する
.dgvList.FirstDisplayedCell = .dgvList.CurrentCell
chiroru
ベテラン
会議室デビュー日: 2008/10/02
投稿数: 59
投稿日時: 2009-02-04 11:52
すみません。追記します。
実行した結果ですが、
dgvList.CurrentCell = .dgvList.Rows(r.Index).Cells(0)
上記コードのr.Indexが取得できていないようです。
データの行数を取得するにはどうすればいいでしょうか?
デューン
大ベテラン
会議室デビュー日: 2004/04/21
投稿数: 174
お住まい・勤務地: Tokyo
投稿日時: 2009-02-04 13:17
TableAdapterによってバインドされたDataGridViewのデータソースの行と
自前でとってきたDataSetの行とを Is演算子で比較してますが、
これはうまくいかないのでは?
(持っている内容は同じでも内部的には別のオブジェクトですから)


コード:
If row Is findRow Then 
   dgvRow.Selected = True 
   Exit For
End If


ではなく、たとえば
コード:
If row("CD").ToString() = findRow("CD").ToString() Then 
   dgvRow.Selected = True 
   Exit For
End If


などとしてみてはどうでしょう。
(ただし、もともと選択されていた行のSelectedをFalseにしていないので、複数選択されることになると思います)

引用:

dgvList.CurrentCell = .dgvList.Rows(r.Index).Cells(0)
上記コードのr.Indexが取得できていないようです。


とは何をみて「取得できていない」とおっしゃってるのでしょうか?
ex)
NullReferenceなどの例外がおきる
値が期待通りではない
その行を通らなかった


chiroru
ベテラン
会議室デビュー日: 2008/10/02
投稿数: 59
投稿日時: 2009-02-04 16:02
引用:

引用:

dgvList.CurrentCell = .dgvList.Rows(r.Index).Cells(0)
上記コードのr.Indexが取得できていないようです。


とは何をみて「取得できていない」とおっしゃってるのでしょうか?



dgvRow.Selected = True
を通っていなかったため、r.Index=0になっていたという意味でした。
わかりずらくてすみません。
デューンさんの教えてもらった内容でうまく動作しました。
原因も理解できました。
ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)