グリッドビューから行を削除すると、削除するように選択された行は削除されず、グリッドビューの最後の行が削除されます。また、現在最後の行である行のユーザー入力をクリアしますが、他のすべての行は入力を維持します。これに関するヘルプは大歓迎です。
ここに私の RowDeleting サブがあります:
Protected Sub gvPDetails_RowDeleting(sender As Object, e As System.Web.UI.WebControls.GridViewDeleteEventArgs) Handles gvPDetails.RowDeleting
If ViewState("CurrentTable") IsNot Nothing Then
Dim dt As DataTable = DirectCast(ViewState("CurrentTable"), DataTable)
Dim delRowIndex As Integer = Convert.ToInt32(e.RowIndex)
Dim delRow As DataRow = dt.Rows(delRowIndex)
dt.Rows.Remove(delRow)
SetRowData()
ViewState("CurrentTable") = dt
End If
End Sub
ここに SetRowData() があります
Private Sub SetRowData()
Dim rowIndex As Integer = 0
Dim arrl1 As New ArrayList()
Dim arrl2 As New ArrayList()
Dim arrl3 As New ArrayList()
If ViewState("CurrentTable") IsNot Nothing Then
Dim dtCurrentTable As DataTable = DirectCast(ViewState("CurrentTable"), DataTable)
Dim drCurrentRow As DataRow = Nothing
If dtCurrentTable.Rows.Count > 0 Then
For i As Integer = 0 To dtCurrentTable.Rows.Count - 1
//extract the TextBox values
Dim box1 As TextBox = DirectCast(gvPDetails.Rows(rowIndex).FindControl("txtStore"), TextBox)
//extract the DropDownList Selected Items
Dim ddl1 As DropDownList = DirectCast(gvPDetails.Rows(rowIndex).FindControl("ddlStatus"), DropDownList)
Dim ddl2 As DropDownList = DirectCast(gvPDetails.Rows(rowIndex).FindControl("ddlReason"), DropDownList)
Dim ddl3 As DropDownList = DirectCast(gvPDetails.Rows(rowIndex).FindControl("ddlPldDetail"), DropDownList)
Dim box2 As TextBox = DirectCast(gvPDetails.Rows(rowIndex).FindControl("txtInfo"), TextBox)
//Update the DataRow with the DDL Selected Items
dtCurrentTable.Rows(rowIndex)("Store") = box1.Text
dtCurrentTable.Rows(rowIndex)("Status") = ddl1.SelectedItem.Text
myDD1 = ddl1.SelectedItem.Text
dtCurrentTable.Rows(rowIndex)("Reason") = ddl2.SelectedItem.Text
myDD2 = ddl2.SelectedItem.Text
If ddl3 IsNot Nothing And ddl3.Enabled = True Then
dtCurrentTable.Rows(rowIndex)("Detail") = ddl3.SelectedItem.Text
End If
myDD3 = ddl3.SelectedItem.Text
dtCurrentTable.Rows(rowIndex)("Information") = box2.Text
rowIndex += 1
Dim MemErrList As New ArrayList()
Dim index As Integer = -1
Dim row As GridViewRow = gvPDetails.Rows(i)
index = CInt(gvPDetails.DataKeys(row.RowIndex).Value)
Dim result As Boolean = DirectCast(gvPDetails.Rows(i).FindControl("ckbMemErr"), CheckBox).Checked
//Check in the Session
If Session("CHECKED_ITEMS") IsNot Nothing Then
MemErrList = DirectCast(Session("CHECKED_ITEMS"), ArrayList)
End If
If result Then
If Not MemErrList.Contains(index) Then
MemErrList.Add(index)
End If
Else
MemErrList.Remove(index)
End If
//Next
If MemErrList IsNot Nothing AndAlso MemErrList.Count > 0 Then
Session("CHECKED_ITEMS") = MemErrList
End If
//----SLS File Val Checkbox Array Builder-----------------------------
Dim DetailList As New ArrayList()
Dim index1 As Integer = -1
Dim row1 As GridViewRow = gvPDetails.Rows(i)
index1 = CInt(gvPDetails.DataKeys(row1.RowIndex).Value)
Dim result1 As Boolean = DirectCast(gvPDetails.Rows(i).FindControl("cbSLSFileVal"), CheckBox).Checked
//Check in the Session
If Session("DETAIL1_ITEMS") IsNot Nothing Then
DetailList = DirectCast(Session("DETAIL1_ITEMS"), ArrayList)
End If
If result1 Then
If Not DetailList.Contains(index1) Then
DetailList.Add(index1)
End If
Else
DetailList.Remove(index1)
End If
//Next
If DetailList IsNot Nothing AndAlso DetailList.Count > 0 Then
Session("DETAIL1_ITEMS") = DetailList
End If
//----Router Checkbox Array Builder-----------------------------
Dim DetailList2 As New ArrayList()
Dim index2 As Integer = -1
Dim row2 As GridViewRow = gvPDetails.Rows(i)
index2 = CInt(gvPDetails.DataKeys(row2.RowIndex).Value)
Dim result2 As Boolean = DirectCast(gvPDetails.Rows(i).FindControl("cbRouter"), CheckBox).Checked
//Check in the Session
If Session("DETAIL2_ITEMS") IsNot Nothing Then
DetailList2 = DirectCast(Session("DETAIL2_ITEMS"), ArrayList)
End If
If result2 Then
If Not DetailList2.Contains(index2) Then
DetailList2.Add(index2)
End If
Else
DetailList2.Remove(index2)
End If
//Next
If DetailList2 IsNot Nothing AndAlso DetailList2.Count > 0 Then
Session("DETAIL2_ITEMS") = DetailList2
End If
//----Register1 Checkbox Array Builder-----------------------------
Dim DetailList3 As New ArrayList()
Dim index3 As Integer = -1
Dim row3 As GridViewRow = gvPDetails.Rows(i)
index3 = CInt(gvPDetails.DataKeys(row3.RowIndex).Value)
Dim result3 As Boolean = DirectCast(gvPDetails.Rows(i).FindControl("cbRegister1"), CheckBox).Checked
//Check in the Session
If Session("DETAIL3_ITEMS") IsNot Nothing Then
DetailList3 = DirectCast(Session("DETAIL3_ITEMS"), ArrayList)
End If
If result3 Then
If Not DetailList3.Contains(index3) Then
DetailList3.Add(index3)
End If
Else
DetailList3.Remove(index3)
End If
//Next
If DetailList3 IsNot Nothing AndAlso DetailList3.Count > 0 Then
Session("DETAIL3_ITEMS") = DetailList3
End If
//----Register2 Checkbox Array Builder-----------------------------
Dim DetailList4 As New ArrayList()
Dim index4 As Integer = -1
Dim row4 As GridViewRow = gvPDetails.Rows(i)
index4 = CInt(gvPDetails.DataKeys(row4.RowIndex).Value)
Dim result4 As Boolean = DirectCast(gvPDetails.Rows(i).FindControl("cbRegister2"), CheckBox).Checked
//Check in the Session
If Session("DETAIL4_ITEMS") IsNot Nothing Then
DetailList4 = DirectCast(Session("DETAIL4_ITEMS"), ArrayList)
End If
If result4 Then
If Not DetailList4.Contains(index4) Then
DetailList4.Add(index4)
End If
Else
DetailList4.Remove(index4)
End If
//Next
If DetailList4 IsNot Nothing AndAlso DetailList4.Count > 0 Then
Session("DETAIL4_ITEMS") = DetailList4
End If
arrl1.Add(myDD1)
arrl2.Add(myDD2)
arrl3.Add(myDD3)
Next
//dtCurrentTable.Rows.Add(drCurrentRow)
ViewState("CurrentTable") = dtCurrentTable
//Rebind the Grid with the current data to reflect changes
gvPDetails.DataSource = dtCurrentTable
gvPDetails.DataBind()
End If
Else
End If
//Set Previous Data on Postbacks
SetPrevDataOnDelete(arrl1, arrl2, arrl3)
End Sub
そして、ここに SetPrevDataOnDelete(arrl1, arl2, arl3) があります
Private Sub SetPrevDataOnDelete(ByVal arrl1 As ArrayList, ByVal arrl2 As ArrayList, ByVal arrl3 As ArrayList)
Dim rowIndex As Integer = 0
myGridViewRow = 0
If ViewState("CurrentTable") IsNot Nothing Then
Dim dt As DataTable = DirectCast(ViewState("CurrentTable"), DataTable)
If dt.Rows.Count > 0 Then
Dim arr1 As ArrayList = arrl1
Dim arr2 As ArrayList = arrl2
Dim arr3 As ArrayList = arrl3
For i As Integer = 0 To dt.Rows.Count - 1
Dim box1 As TextBox = DirectCast(gvPDetails.Rows(rowIndex).FindControl("txtStore"), TextBox)
Dim ddl1 As DropDownList = DirectCast(gvPDetails.Rows(rowIndex).FindControl("ddlStatus"), DropDownList)
Dim ddl2 As DropDownList = DirectCast(gvPDetails.Rows(rowIndex).FindControl("ddlReason"), DropDownList)
Dim ddl3 As DropDownList = DirectCast(gvPDetails.Rows(rowIndex).FindControl("ddlPldDetail"), DropDownList)
Dim box2 As TextBox = DirectCast(gvPDetails.Rows(rowIndex).FindControl("txtInfo"), TextBox)
Dim cbResult As CheckBox = DirectCast(gvPDetails.Rows(rowIndex).FindControl("ckbMemErr"), CheckBox)
//Fill the DropDownList with Data
myGridViewRow = i
//FillDropDownList(ddl1)
FillDDL2OnDel(arrl1, rowIndex)
FillDDL3OnDel(arrl1, arrl2, rowIndex)
If i < dt.Rows.Count - 1 Then
//Assign the value from DataTable to the TextBox
//gvPDetails.Rows(i).Cells(0).Text = Convert.ToString(i + 1)
box1.Text = dt.Rows(rowIndex)("Store").ToString()
box2.Text = dt.Rows(rowIndex)("Information").ToString()
ddl1.Items.FindByText(dt.Rows(rowIndex)("Status").ToString()).Selected = True
If ddl2 Is Nothing Then
ElseIf ddl2 Is Nothing Then
ElseIf ddl2 IsNot Nothing And ddl2.Enabled = True Then
ddl2.Items.FindByText(dt.Rows(rowIndex)("Reason").ToString()).Selected = True
End If
If ddl3 IsNot Nothing And ddl3.Enabled = True Then
ddl3.Items.FindByText(dt.Rows(rowIndex)("Detail").ToString()).Selected = True
End If
Dim MemErrList As ArrayList = DirectCast(Session("CHECKED_ITEMS"), ArrayList)
If MemErrList IsNot Nothing AndAlso MemErrList.Count > 0 Then
Dim row As GridViewRow = gvPDetails.Rows(i)
Dim index As Integer = CInt(gvPDetails.DataKeys(row.RowIndex).Value)
If MemErrList.Contains(index) Then
Dim myCheckBox As CheckBox = DirectCast(row.FindControl("ckbMemErr"), CheckBox)
myCheckBox.Checked = True
End If
//Next
End If
Dim DetailList As ArrayList = DirectCast(Session("DETAIL1_ITEMS"), ArrayList)
If DetailList IsNot Nothing AndAlso DetailList.Count > 0 Then
Dim row As GridViewRow = gvPDetails.Rows(i)
Dim index1 As Integer = CInt(gvPDetails.DataKeys(row.RowIndex).Value)
If DetailList.Contains(index1) Then
Dim myCheckBox1 As CheckBox = DirectCast(row.FindControl("cbSLSFileVal"), CheckBox)
myCheckBox1.Checked = True
End If
//Next
End If
Dim DetailList2 As ArrayList = DirectCast(Session("DETAIL2_ITEMS"), ArrayList)
If DetailList2 IsNot Nothing AndAlso DetailList2.Count > 0 Then
Dim row As GridViewRow = gvPDetails.Rows(i)
Dim index2 As Integer = CInt(gvPDetails.DataKeys(row.RowIndex).Value)
If DetailList2.Contains(index2) Then
Dim myCheckBox2 As CheckBox = DirectCast(row.FindControl("cbRouter"), CheckBox)
myCheckBox2.Checked = True
End If
//Next
End If
Dim DetailList3 As ArrayList = DirectCast(Session("DETAIL3_ITEMS"), ArrayList)
If DetailList3 IsNot Nothing AndAlso DetailList3.Count > 0 Then
Dim row As GridViewRow = gvPDetails.Rows(i)
Dim index3 As Integer = CInt(gvPDetails.DataKeys(row.RowIndex).Value)
If DetailList3.Contains(index3) Then
Dim myCheckBox3 As CheckBox = DirectCast(row.FindControl("cbRegister1"), CheckBox)
myCheckBox3.Checked = True
End If
//Next
End If
Dim DetailList4 As ArrayList = DirectCast(Session("DETAIL4_ITEMS"), ArrayList)
If DetailList4 IsNot Nothing AndAlso DetailList4.Count > 0 Then
Dim row As GridViewRow = gvPDetails.Rows(i)
Dim index4 As Integer = CInt(gvPDetails.DataKeys(row.RowIndex).Value)
If DetailList4.Contains(index4) Then
Dim myCheckBox4 As CheckBox = DirectCast(row.FindControl("cbRegister2"), CheckBox)
myCheckBox4.Checked = True
End If
//Next
End If
End If
rowIndex += 1
Next
End If
End If
End Sub
助けてくれてありがとう。