Я создаю DataGrid в VB.Net 2003, который получает данные из SQL.Все столбцы с данными SQL являются BoundColumn с дополнительным ButtonColumn в конце для изменения статуса столбца.
В этом состоянии я могу нажать кнопку строки, и соответствующие данные в этой строке могут измениться без проблем.Но моя проблема возникает, когда мне нужно добавить функцию фильтрации в DataGrid.
После того, как данные отфильтрованы, и я пытаюсь нажать на кнопку 1-й строки, я не вижу изменений.Это только до тех пор, пока я не удалю фильтр и не увижу, что данные изменились в первой нефильтрованной строке.
1. Before filter data:
001 | QW34 | OK | <BUTTON>
002 | XC00 | OK | <BUTTON>
003 | GH66 | OK | <BUTTON>
2. After filter data:
002 | XC00 | OK | <BUTTON>
3. Click the button to change OK to NG and vice versa.
4. Filter data remains the same. Return back to original table state.
001 | QW34 | NG | <BUTTON>
002 | XC00 | OK | <BUTTON>
003 | GH66 | OK | <BUTTON>
Надеюсь, это поможет объяснить мою точку зрения.По сути, поскольку столбец кнопки является просто обычным ButtonColumn, он не привязан к строкам BoundColumn, поэтому при каждом изменении строк в фильтре столбец Button остается неизменным.
Какможно сделать так, чтобы мой столбец кнопок имел те же свойства, что и связанный столбец?Есть ли в VB.Net 2003 свойства addiitoanl, о которых я не знаю?
Здесь подпрограмма для привязки моих данных SQL к моей DataGrid.Вместе с подпрограммой для фильтрации данных.
Public Sub BindGrid()
Dim strSql As String = "Select * from [SQL3].[dbo].[Final] order by [Course Code]"
Dim dtb As New DataTable
SQLDB.Open()
Dim dad As New SqlDataAdapter(strSql, SQL)
dad.Fill(dtb)
SQL.Close()
DataGrid1.DataSource = dtb
DataGrid1.DataBind()
dtb.Clear()
End Sub
Public Sub filter()
If DropDownList1.SelectedItem.ToString = "[ALL]" Then
Call BindGrid()
Else
Dim strSelectCmd As String = "Select * from [SQL3].[dbo].[Final] where result = '" & DropDownList1.SelectedItem.ToString & "'"
Dim dtb As New DataTable
SQL.Open()
Dim dad As New SqlDataAdapter(strSelectCmd, SQL)
dad.Fill(dtb)
SQL.Close()
DataGrid1.DataSource = dtb
DataGrid1.DataBind()
End If
End Sub
А вот подпункт для столбца кнопки в каждой строке для изменения статуса флага и обновления до SQL.
Private Sub CellClick_CellValueChanged(ByVal sender As Object, ByVal e As DataGridCommandEventArgs) Handles DataGrid1.ItemCommand
Session("Employee_No") = e.Item.Cells(2).Text
Session("Course_Code") = e.Item.Cells(0).Text
Session("Flag") = e.Item.Cells(8).Text
'Change Flag Status in SQL
If Session("Flag") = "Active" Then
Dim updateState As String = "update [SQLDB3].[dbo].[ZOJT_EMP_COURSE]" _
& "set [Flag] = 'Inactive'" _
& "where Employee_No = '" & Session("Employee_No") & "'" _
& "and CourseCode = '" & Session("Course_Code") & "'"
Dim conn = SQLDB
Dim command As New SqlCommand(updateState, conn)
conn.open()
command.ExecuteNonQuery()
conn.close()
Label3.Text = Session("Course_Code")
Call filter()
conn.dispose()
command.Dispose()
'Response.Redirect(HttpContext.Current.Request.Url.ToString(), True)
ElseIf Session("Flag") = "Inactive" Then
Dim updateState As String = "update [SQLDB3].[dbo].[ZOJT_EMP_COURSE]" _
& "set [Flag] = 'Active'" _
& "where Employee_No = '" & Session("Employee_No") & "'" _
& "and CourseCode = '" & Session("Course_Code") & "'"
Dim conn = SQLDB
Dim command As New SqlCommand(updateState, conn)
conn.open()
command.ExecuteNonQuery()
conn.close()
Label3.Text = Session("Course_Code")
Call filter()
conn.dispose()
command.Dispose()
End If
End Sub