2012-03-01 9 views
0
 Dim datatable_default_view As DataTable = _datatable.DefaultView.ToTable 
     Dim servicenumber As String = datatable_default_view.Rows.Item(e.RowIndex)("Service Number").ToString 
'gets the service number of the selected row 

     If _datatable.PrimaryKey.Length = 0 Then 
      Dim keys(0) As DataColumn 
      keys(0) = _datatable.Columns("Service Number") 
      _datatable.PrimaryKey = keys 
     End If 

     Dim datarow_edited As DataRow = _datatable.Rows.Find(servicenumber) 

     Try 
      MsgBox("Record" + datarow_edited("service number") + " was edited") 
     Catch ex As Exception 
      MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Error") 
     End Try 

動作しません:
セル内の終了時に「data_row編集した」変数は初期化されません。 キーボードを使用してモードを編集します(例:下向き矢印を押す)。 マウスを使用すると、正常に動作します。どうしてこれなの ?それは私がVB.net 2008を使用している既知のバグですか?助けてくださいdatatable.Rows.Findは、私がDatagridView_CellEndEditイベント</p> <p>問題の下にこのコードを入れている

私はサンプルデータhereとサンプルプロジェクトをアップロードしました。可能であれば、それをチェックしてください。

答えて

1

VS 2010のサンプルソリューションを試してみましたが、意図したとおりに動作しています。矢印キーで行を切り替えるときも、DataRowが正しく初期化されます。

編集:

あなたは今、ごめんなさい。

舞台裏でいくつかの非同期の問題のように見えます。

はたぶん、あなたのための回避策

Imports System.Data.OleDb 
Public Class Form1 
    Private _datatable As DataTable 
    Dim conn As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=Members Database.mdb;Persist Security Info=False" 


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
     Dim connection As New OleDbConnection(conn) 
     Dim adapter As OleDbDataAdapter 


     Dim _branchname As String = "A BAUR" 
     Dim cmd As String = "Select [Service Number] ,[Name], [Gender], [Subscription] from " + _branchname.Insert(0, "[") + "]" 
     adapter = New OleDbDataAdapter(cmd, conn) 
     _datatable = New DataTable 
     adapter.Fill(_datatable) 


     If _datatable.PrimaryKey.Length = 0 Then 

      Dim keys(0) As DataColumn 
      keys(0) = _datatable.Columns("Service Number") 
      _datatable.PrimaryKey = keys 
     End If 


     AddHandler _datatable.RowChanged, AddressOf _datatable_RowChanged 

     DataGridView1.DataSource = _datatable 

    End Sub 


    Private Sub _datatable_RowChanged(sender As Object, e As System.Data.DataRowChangeEventArgs) 

     Dim servicenumber = e.Row("Service Number") 

     Dim datarow_edited As DataRow = _datatable.Rows.Find(servicenumber) 

     Try 
      MsgBox("Record" + datarow_edited("service number") + " was edited") 
     Catch ex As Exception 
      MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Error") 
     End Try 
    End Sub 

End Class 
+0

私はXPでもVS 2008を使用しています(7も試しました)。これは[**クリップ**](https://skydrive.live.com/redir.aspx?cid=923085ae74a2e362&resid=923085AE74A2E362!302&parid = 923085AE74A2E362!300&authkey =!AHGVjqhn6ODlJRo)あなたに何が起こっているのかを伝えてください。キーボードを使用して終了すると(2回目の試み)、「オブジェクト参照はオブジェクトのインスタンスに設定されていません」というエラーが表示されます – gawicks

+0

これは機能しました!ありがとうMan.Youロック! – gawicks

0
Dim servicenumber As String = _datatable.Rows(e.RowIndex)("Service Number").ToString() 
+0

いや可能性がデータテーブル自体のRowChangedイベントを処理します。それは動作していないようです。 – gawicks

+0

私はユーザーがbindingSourceを使用してデータをフィルタリングできるようにしているのでDefaultViewを使用しています._datatable.Rows(e.RowIndex)を使用すると、フィルタされたテーブルのRowIndexが実際のテーブルではありません:) – gawicks

関連する問題