如何从GridView中的隐藏列检索数据? VB

时间:2014-10-02 05:26:07

标签: asp.net vb.net gridview

我有点被困在这里,经过一些研究,我似乎无法找到答案。无论如何,我不知道如何在Gridview隐藏列中检索主键。

这是我的gridview

<asp:GridView ID="grdDent" runat="server" AutoGenerateColumns="False" Width="852px" DataKeyNames="app_id">
                    <Columns>
                        <asp:TemplateField>
                            <EditItemTemplate>
                                <asp:CheckBox ID="chkApp" runat="server" />
                            </EditItemTemplate>
                            <ItemTemplate>
                                <asp:CheckBox ID="chkApp" runat="server" />
                            </ItemTemplate>
                        </asp:TemplateField>
                        <asp:BoundField DataField="app_id" HeaderText="app_id" Visible="False" />
                        <asp:BoundField DataField="app_date" HeaderText="Date" SortExpression="Date" />
                        <asp:BoundField DataField="app_time" HeaderText="Time" SortExpression="Time" />
                        <asp:BoundField DataField="app_rsn" HeaderText="Reason" SortExpression="Reason" />
                        <asp:BoundField DataField="app_info" HeaderText="Comment" SortExpression="Comment" />
                        <asp:BoundField DataField="app_sts" HeaderText="Status" SortExpression="Status" />
                        <asp:BoundField DataField="Patient" HeaderText="Requested by" SortExpression="Patient" />
                        <asp:BoundField DataField="app_timestamp" HeaderText="Date requested" SortExpression="Date requested" />
                    </Columns>
                </asp:GridView>

这是我点击按钮时的代码

For Each row As GridViewRow In grdDent.Rows
        If row.RowType = DataControlRowType.DataRow Then
            Dim chkApp As CheckBox = TryCast(row.Cells(0).FindControl("chkApp"), CheckBox)
            If chkApp.Checked Then
                cmd = New MySqlCommand("UPDATE appointment_table SET app_sts = 'Approved' WHERE app_id = @p1", con)
                cmd.Parameters.AddWithValue("@p1", row.Cells(1).Text)
                con.Open()
                cmd.ExecuteNonQuery()
                con.Close()
            End If
        End If
    Next

这是我填写gridview的代码

Using cmd = New MySqlCommand("SELECT app_id, app_date, app_time, app_rsn, app_info, app_sts, group_concat(pat_lname, pat_fname) As Patient, app_timestamp FROM appointment_table INNER JOIN patient_table WHERE app_sts = 'Queue'", con)
            con.Open()
            Dim ds As New DataSet()
            Dim a As New MySqlDataAdapter(cmd)
            a.Fill(ds)
            grdDent.DataSource = ds
            grdDent.DataBind()
            con.Close()
        End Using

现在的问题是,每当我点击按钮时,它都不会做任何事情,甚至不显示错误,所以我不知道该怎么做。

5 个答案:

答案 0 :(得分:0)

您可以使用以下内容:

For Each row As GridViewRow In yourgrid.Rows
   Dim chk As CheckBox = CType(row.FindControl("chkApp"), CheckBox)
   If chk IsNot Nothing And chk.Checked Then
      'get your selected row data here and perform update operation
End If
Next row

注意:我的建议是先调试代码,确保代码运行正常,方法调用完美。

您可以查看getting asp.net gridview selected row data from server-side以获取更多详细信息。

希望它可以帮到你!

答案 1 :(得分:0)

首先调试代码并检查从哪一行获得错误。

还可以尝试以下代码。     .HideData     {         display:none;     }

替换您的app_id绑定字段,如下所示。

不要使用可见的虚假属性。

答案 2 :(得分:0)

当您设置visible=false时,该列不会在gridview html中呈现。 所以,而不是visible=false使style='display:none'

像这样使用:

  <asp:BoundField DataField="ItemDesc" HeaderText="app_id"  >
                 <ItemStyle CssClass="hidden"/>

                 </asp:BoundField>



<style type="text/css">
     .hidden
     {
         display:none;
     }
</style>

并在foreach循环

中使用此功能
dim appid as string

appid=row.Cells(1).Text

答案 3 :(得分:0)

我看到你将主键存储在DataKeyNames =&#34; app_id&#34; 所以你可以在代码中用

抓住它
grdDent.DataKeys.Item(a row index here).Value

您可以删除包含此值的BoundField。它是&#34;可见=错误&#34;不会有任何价值。

答案 4 :(得分:0)

我这样做是这样的..

首先删除你的边界,然后只添加一个标签到这样的模板字段之一。

<asp:GridView ID="grdDent" runat="server" AutoGenerateColumns="False" Width="852px" DataKeyNames="app_id">
                <Columns>
                    <asp:TemplateField>
                        <EditItemTemplate>
                            <asp:CheckBox ID="chkApp" runat="server" />
                        </EditItemTemplate>
                        <ItemTemplate>
                            <asp:CheckBox ID="chkApp" runat="server" />
                            <asp:Label ID="lblApp_ID" Visible="False" runat="server" Text='<%# Bind("app_id") %>'></asp:Label>
                        </ItemTemplate>
                    </asp:TemplateField>
                    <asp:BoundField DataField="app_date" HeaderText="Date" SortExpression="Date" />
                    <asp:BoundField DataField="app_time" HeaderText="Time" SortExpression="Time" />
                    <asp:BoundField DataField="app_rsn" HeaderText="Reason" SortExpression="Reason" />
                    <asp:BoundField DataField="app_info" HeaderText="Comment" SortExpression="Comment" />
                    <asp:BoundField DataField="app_sts" HeaderText="Status" SortExpression="Status" />
                    <asp:BoundField DataField="Patient" HeaderText="Requested by" SortExpression="Patient" />
                    <asp:BoundField DataField="app_timestamp" HeaderText="Date requested" SortExpression="Date requested" />
                </Columns>
            </asp:GridView>

通过执行此操作,它会将标签放在每一行中,但它不会显示给用户以及显示“Text='<%# Bind("app_id") %>'”的部分,该部分将文本绑定到每行中的该标签。

现在,对于按钮单击的代码,您应该使用:

Dim i As Integer = 0
    Dim app_ID As Integer '<- I was using an integer but you can use any datatype
    For Each row As GridViewRow In grdDent.Rows
        If CType(row.FindControl("chkApp"), CheckBox).Checked = True Then
            app_ID = CType(grdDent.Rows(i).FindControl("lblApp_ID"), Label).Text
            cmd = New MySqlCommand("UPDATE appointment_table SET app_sts = 'Approved' WHERE app_id =" & app_ID , con)
            con.Open()
            cmd.ExecuteNonQuery()
            con.Close()
        End If
        i += 1
    Next

所有这些对我有用,所以我希望它适合你!