2016-04-30 4 views
0

私はBindingSourceにバインドされたDataGridViewを持っています。私は、新しいレコードを追加するためのボタンがあります。AddNew()、この行を削除する問題

Private Sub btnNew_Click(sender As Object, e As EventArgs) Handles btnNew.Click 
    _bsStaff.AddNew() 
End Sub 

これはまた、「次の新しい/ブランク」の行とそれに続く、新しい行を作成して行います。これは試してみて、この新しく追加された行を削除するために、私はすぐに私の[削除]ボタンを押した場合を除いて、正常に動作します:

Private Sub btnDelete_Click(sender As Object, e As EventArgs) Handles btnDelete.Click 
    If MessageBox.Show("Delete staff member record?", "Confirm", MessageBoxButtons.YesNo, _ 
         MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then 
     _bsStaff.RemoveCurrent() 
    End If 
End Sub 

これは、新しい行が、また、それ以前に1を削除します!

RemoveCurrent、_bsStaff.EndEdit()およびIf _bsStaff.Position + 1 = _bsStaff.Count Thenの前に行を追加しようとしましたが、動作は継続されます。

誰かがこの動作を説明して解決策を提示できますか?


追加:私は、私はそれが行の状態をチェックし、このコードを破ったと思った:

Private Sub btnDelete_Click(sender As Object, e As EventArgs) Handles btnDelete.Click 

    Dim state = CType(_bsStaff.Current, DataRowView).Row.RowState 
    Select Case state 
     Case DataRowState.Added 
      _bsStaff.RemoveCurrent() 
     Case DataRowState.Deleted 
      MessageBox.Show("Row already deleted.", "Delete") 
     Case DataRowState.Detached 
      _bsStaff.CancelEdit() 
     Case DataRowState.Modified 
      If MessageBox.Show("Delete staff member record?", "Confirm", MessageBoxButtons.YesNo, _ 
           MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then 
       _bsStaff.RemoveCurrent() 
      End If 
     Case DataRowState.Unchanged 
      If _bsStaff.Position + 1 > _bsStaff.Count Then 
       'do nothing, the new row 
      ElseIf MessageBox.Show("Delete staff member record?", "Confirm", MessageBoxButtons.YesNo, _ 
           MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then 
       _bsStaff.RemoveCurrent() 
      End If 
     Case Else 
      'do nothing 
    End Select 
End Sub 

しかし、スクリーンショットを見て、とき

enter image description here

私は新しい行をクリックし、私のボタンをクリックして、それはUnchanged状態ですが、それはcurを持つ前の行ですレンタルレコードポインタ(Unchanged状態がおそらく参照する)は、削除される行です。

基本的には、新しい行がちょうどクリックされたことを検出する方法が必要だと思いますが、何も入力されていないので、削除しようとすることはできません。

+0

プロセス内でどこかでイベントコードが発生しないようにしてください。実際のデータリポジトリとは何ですか? – Plutonix

+0

'DefaultValuesNeeded'は部門コンボボックスから項目を選択するために使用されます。データは、スタッフと部門の2つのテーブルを持つSQL Serverです。ああ、これに影響を与えるのはこのコードですが、私はまだこのコードを使って部署を選択する必要があります。このコードがなくても、新しい行をクリックして削除すると、前の行も削除されます。しかしこれはやや異なる問題でしょうか? –

+0

新しい行をクリックすると、直ちに増分値-1、-2などが作成されます。 –

答えて

0

(。行(s)は、この珍しい、発生しやすい、状態にあることを検出するいくつかの方法が存在しなければならない)、および比較とコメント(と批判)のために、私は投稿します私の第二の、改善された、ここの解決策。ここで

は、Deleteメソッドのための私の現在の完全なコードブロックです:

Private Sub btnDelete_Click(sender As Object, e As EventArgs) Handles btnDelete.Click 
    If _bsStaff.Current Is Nothing Then 
     Exit Sub  'nothing to consider deleting 
    End If 
    Dim currentRow = CType(_bsStaff.Current, DataRowView).Row 
    Dim sMemberMessage As String 

    Dim state = currentRow.RowState 
    Select Case state 
     Case DataRowState.Added 
      'newly added, just remove it 
      _bsStaff.RemoveCurrent() 
     Case DataRowState.Deleted 
      MessageBox.Show("Row already deleted.", "Delete") 
     Case DataRowState.Detached 
      _bsStaff.CancelEdit() 
     Case DataRowState.Modified, DataRowState.Unchanged 
      If dgvStaff.SelectedCells.Count > 0 AndAlso _ 
        dgvStaff.SelectedCells(0).RowIndex = dgvStaff.NewRowIndex Then 
       'a new, blank, row, is attempted to be deleted 
       '(the current row is the one before this) 
       _bsStaff.CancelEdit() 
       Exit Sub 
      End If 
      sMemberMessage = String.Format("Delete record ({0} {1} {2}) ?", _ 
        _bsStaff.Current("StaffID"), _bsStaff.Current("FirstName"), _bsStaff.Current("LastName")) 
      If MessageBox.Show(sMemberMessage, "Confirm", MessageBoxButtons.YesNo, _ 
           MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then 
       _bsStaff.RemoveCurrent() 
      End If 
     Case Else 
      'do nothing 
    End Select 
End Sub 

キーコンポーネントはここにある:

私の問題のスクリーンショットを見ると
 Case DataRowState.Modified, DataRowState.Unchanged 
      If dgvStaff.SelectedCells.Count > 0 AndAlso _ 
        dgvStaff.SelectedCells(0).RowIndex = dgvStaff.NewRowIndex Then 
       'a new, blank, row, is attempted to be deleted 
       '(the current row is the one before this) 
       _bsStaff.CancelEdit() 
       Exit Sub 
      End If 

、現在の行があるものの、 1つは新しい行のすぐ上にあり、新しい行にはまだSelectedCellがあります。dgvStaff.SelectedCells(0).RowIndex = dgvStaff.NewRowIndexで、このセルが新しい(空白の)行にあることを確認しています。今度はだけがこの新しい行をクリックしているので、それはUnchanged状態にあり、すぐに私が検出しようとしている正確な状況である削除ボタンを押した場合です。この新しい行に何かを入力した場合、それはもはや新しい行ではなくなり(テスト条件が満たされなくなる)、変更されていない状態になりません。このような状況では、以前のケースでは既に行が放棄されていました。

(私はまだこれを改善することを望んでいますが)それはまた私がキャプチャしようとしている非常に特定の状況です。

0

私の現在の解決策は、より専門的な解決策で誰かを悩ませてくれることを願って、提案したが、嫌な回答として投稿します。

私は明示的に、彼らは削除しようとしていたレコードのユーザ言って、現時点で実用的なアプローチを取っている:一つは、彼らことを誰かが唯一のちょうど新しい行にクリックした場合のことを思うだろう

Private Sub btnDelete_Click(sender As Object, e As EventArgs) Handles btnDelete.Click 
    Dim currentRow = CType(_bsStaff.Current, DataRowView).Row 
    Dim sMemberMessage As String 

    Dim state = currentRow.RowState 
    Select Case state 
     Case DataRowState.Added 
      _bsStaff.RemoveCurrent() 
     Case DataRowState.Deleted 
      MessageBox.Show("Row already deleted.", "Delete") 
     Case DataRowState.Detached 
      _bsStaff.CancelEdit() 
     Case DataRowState.Modified, DataRowState.Unchanged 
      sMemberMessage = String.Format("Delete record ({0} {1} {2}) ?", _ 
        _bsStaff.Current("StaffID"), _bsStaff.Current("FirstName"), _bsStaff.Current("LastName")) 
      If MessageBox.Show(sMemberMessage, "Confirm", MessageBoxButtons.YesNo, _ 
           MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then 
       _bsStaff.RemoveCurrent() 
      End If 
     Case Else 
      'do nothing 
    End Select 
End Sub 

をそれをクリックするだけですが、すぐに増分値を挿入して部門を選択するため、削除ボタンをクリックすることを推奨します。

一方

関連する問題