Private Sub tb_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs)
'----------------------------------------------------------------------------------------- ' セル位置の退避 '----------------------------------------------------------------------------------------- mRowNum = DataGrid1.CurrentCell.RowNumber mColumnNum = DataGrid1.CurrentCell.ColumnNumber End Sub
Private Sub td_CurrentCellChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles DataGrid1.CurrentCellChanged
'----------------------------------------------------------------------------------------- ' 退避したセル位置のチェック・更新 '----------------------------------------------------------------------------------------- If mColumnNum = 0 Then
If Trim(DataGrid1(mRowNum, 0)) <> Space(0) And _ DataGrid1(mRowNum, 0) = "山田" Then
DataGrid1(mRowNum, 1) = "小川" Else
DataGrid1(mRowNum, 1) = Space(0) End If End If
'特に見ていない列番号・行番号を設定(他行に移動が出来なくなるため適当な値を設定) mRowNum = 0 mColumnNum = 0 End Sub
分類:[.NET]
2011/02/16(Wed) 23:22:36 編集(投稿者)
こんばんは、初めて投稿させていただきます。
現在VB.NETで開発を行っております。
開発内容として、
@フォームロードにてDataGridに必要な情報を設定し、DataGridの箱を作成。
A検索ボタンを押下し、DBからデータを取得。
B取得した内容をDataGridに表示(入力等の操作は可能)。
CDataGridのセルAを変更されたらセルAの値に紐づく値で、同じ行のセルBの内容を書き換える。
D登録ボタンを押下し、DBに登録・更新を行う。
という単純な内容をフォーム上で実装しています。
何が問題になっているかというと、
Cの処理をLeaveイベントで呼び出し、値の変更後のセルを確認しているのですが、変更前の値が取れてきてしまいます。
ただし、値を変更してから違うセルにフォーカスを移動させ、再度元のセルにフォーカスを移動すると変更後の値が取得出来ます。
例)
セルAを田島⇒山田に変更。このタイミングでは田島が取得出来てしまうが、他のセルにフォーカスを移動し、再度前述のセルAにフォーカスを移動すると山田が取得出来る。
…という様に、一度フォーカスの移動をしないとセルAの値が正しく判定されない。
※TextChanged、LostFocusイベントで実装しても同じ結果です。
今回.NET自体初めて触るので何が問題になっているのか分かりません…。
以下ソースになりますが、ご教授いただけないでしょうか?(不要であろう箇所は割愛しております)
申し訳ありませんが宜しくお願いします。
Friend Class Form1
Private mStyle As DataGridTableStyle
Private mTable As DataTable
Private mRow As DataRow
Private mSet As New DataSet("テーブル")
'フォームロード処理
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'-----------------------------------------------------------------------------------------
' データグリッドの初期化
'-----------------------------------------------------------------------------------------
mTable = mSet.Tables.Add("テーブル")
Dim DGTS As New DataGridTableStyle
DGTS.MappingName = mTable.TableName
DataGrid1.TableStyles.Add(DGTS)
Dim dc1 As DataColumn = mTable.Columns.Add("項目1", GetType(String))
Dim dc2 As DataColumn = mTable.Columns.Add("項目2", GetType(String))
Dim style1 As New DataGridTextBoxColumn
Dim style2 As New DataGridTextBoxColumn
style1.MappingName = dc1.ColumnName
style2.MappingName = dc2.ColumnName
style1.HeaderText = dc1.ColumnName
style2.HeaderText = dc2.ColumnName
DGTS.GridColumnStyles.Add(style1)
DGTS.GridColumnStyles.Add(style2)
DataGrid1.SetDataBinding(mSet, mTable.TableName)
DataGrid1.CaptionVisible = False
'-----------------------------------------------------------------------------------------
' イベントハンドラ追加
'-----------------------------------------------------------------------------------------
Dim ts As DataGridTableStyle
ts = DataGrid1.TableStyles("テーブル")
'DataGridTextBoxColumnの取得
Dim cs As DataGridTextBoxColumn = CType(ts.GridColumnStyles(1), DataGridTextBoxColumn)
Dim tb As TextBox = cs.TextBox
AddHandler tb.Leave, AddressOf tb_Leave
End Sub
'検索ボタン押下処理
Private Sub cmdSrch_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSrch.Click
'-----------------------------------------------------------------------------------------
' DB検索処理
'-----------------------------------------------------------------------------------------
'〜〜割愛させていただきます〜〜
'-----------------------------------------------------------------------------------------
' データグリッドの設定
'-----------------------------------------------------------------------------------------
'検索する度に行が増えるので、データテーブルをクリア
mTable.Clear()
For i As Integer = 0 To DBの取得件数 - 1
'取得値の設定
mRow = mTable.NewRow
mRow("項目1") = DBのカラム1
mRow("項目2") = DBのカラム2
mTable.Rows.Add(mRow)
Next i
DataGrid1.DataSource = mTable
DataGrid1.SetDataBinding(mSet, mTable.TableName)
End Sub
'フォーカス移動時の処理
Private Sub tb_Leave(ByVal sender As Object, ByVal e As EventArgs)
'-----------------------------------------------------------------------------------------
' 値の確認
'-----------------------------------------------------------------------------------------
Debug.WriteLine("操作行番号:" & DataGrid1.CurrentRowIndex) ←正しい値が表示される
Debug.WriteLine("値:"& DataGrid1(DataGrid1.CurrentRowIndex, 0)) ←変更前の値が表示される
'項目1が山田なら項目2に小川を設定
if DataGrid1(DataGrid1.CurrentRowIndex, 0) = "山田" then
DataGrid1(DataGrid1.CurrentRowIndex, 1) = "小川"
End If
End Sub
End Class