VB.Net 2003 - Как создать столбец кнопки DataGrid со способностью Bound Column? - PullRequest
0 голосов
/ 12 февраля 2019

Я создаю 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
...