0

我有一个网格视图,它通过存储过程指示的数据提取。

屏幕截图 1

该存储过程称为 GetEverything。该声明由来自 2 个表格的信息组成,一个包含人员详细信息,另一个包含船舶详细信息。存储过程 select 语句包含以下 Where 子句:

WHERE Vessel.ArchiveStatus = 0

默认情况下,使用前端应用程序创建的每条新记录都会在数据库中为 ArchiveStatus 指定一个“0”。

因此,gridview 只会显示 ArchiveStatus 为 0 的记录,默认情况下是evertything。

2 个框,选中全部和取消选中全部都可以正常工作。

What I need now is when a REF or REF(s) are selected and the button 'Archive Records' is clicked, for the 0 in the database to be updated to a 1 for that VesselREF.

任何人都可以建议如何执行此操作并给我一些示例代码以放入存档记录按钮的 Default.aspx.vb 文件/事件处理程序中。

有了这个地方,网格视图将只显示未归档的记录,我可以使用自己的 SQL 创建一个单独的网格视图来显示归档记录。

GridView.aspx

    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
        DataKeyNames="REF,VesselREF" DataSourceID="SqlDataSource1" Height="132px" 
        style="text-align: center; font-family: Calibri; font-size: medium" 
        Width="508px" BackColor="#C4FFC4">
        <AlternatingRowStyle BackColor="White" />
        <Columns>
            <asp:TemplateField HeaderText="REF" InsertVisible="False" SortExpression="REF">

                <ItemTemplate>
                    <a href="Details.aspx?REF=<%# Eval("REF")%>"><%# Eval("REF")%></a>
                    <asp:CheckBox ID="RecordSelector" runat="server" />
                </ItemTemplate>
            </asp:TemplateField>
            <asp:BoundField DataField="Title" HeaderText="Title" SortExpression="Title" />
            <asp:BoundField DataField="FirstName" HeaderText="FirstName" 
                SortExpression="FirstName" />
            <asp:BoundField DataField="Surname" HeaderText="Surname" 
                SortExpression="Surname" />
            <asp:BoundField DataField="VesselName" HeaderText="VesselName" 
                SortExpression="VesselName" />
            <asp:BoundField DataField="VesselREF" HeaderText="VesselREF" 
                InsertVisible="False" ReadOnly="True" SortExpression="VesselREF" />

        </Columns>
    </asp:GridView>
4

2 回答 2

2

假设您正在使用TemplateFields并且想要使用存储过程来设置两种存档状态:

Protected Sub btnArchive_Clicked(sender As Object, e As EventArgs)Handles btnArchive.Clicked
    For Each row As GridViewRow In GridView1.Rows
        Dim chk As CheckBox = DirectCast(row.FindControl("ChkRef"), CheckBox)
        If (chk.Checked) Then
            Dim refID As Integer = Integer.Parse(row.Cells(5).Text)
            ArchiveRecord(refID, True)
        End If
    Next
End Sub

Public Shared Sub ArchiveRecord(refID As Integer, archive As Boolean)
    Using con = New SqlConnection(My.Settings.MyConnectionString)
        Using cmd = New SqlCommand("StoredProcedureName", con)
            cmd.CommandType = CommandType.StoredProcedure
            cmd.Parameters.AddWithValue("@RefID", refID)
            cmd.Parameters.AddWithValue("@Archive", archive)
            con.Open()
            Dim affectedrecordCount As Integer = cmd.ExecuteNonQuery()
        End Using
    End Using
End Sub
于 2012-11-05T16:01:15.897 回答
1

您需要使用 GridView.DataKeys 属性并存储每个 DataKey 的行 ID 值。然后,当您更新时,枚举 GridViewRows 并使用 FindControl 来定位 CheckBox。然后检查是否选中了该框,如果是,则连接到一个字符串...

' on update_pressed()...
Dim Ids as new StringBuilder()
For each gvr as gridViewRow in myGv.Rows
   Dim cbx as CheckBox = gvr.FindControl("myCheckBoxID")
   if cbx.Checked Then
      Ids.Append(gvr.DataKeys(gvr.RowIndex).Value.ToString & ",")
   End If
End For
' Ids now contains "5,6,87,356,2355," etc

然后,您可以使用 SQL CSV to Table Variable 函数将 Id 值放入表变量中以使用

于 2012-11-05T15:52:16.447 回答