如何将数据库记录ID正确绑定到GridView行(ASP GridView)?

时间:2017-01-02 09:52:05

标签: c# asp.net gridview

Context是一个古老的ASP 2.0应用程序。

我有一个全局正常工作的gridView:

<asp:GridView ID="GV" runat="server" AutoGenerateColumns="False" DataKeyNames="Id" DataSourceID="DS" AllowPaging="true">
    ...
    <asp:TemplateField HeaderText="MyFieldName" >                    
        <ItemTemplate>
            <asp:CheckBox ID="CB_ID" runat="server"  OnCheckedChanged="CB_CheckedChanged"  AutoPostBack="true"  />
        </ItemTemplate>   
        <EditItemTemplate>
            <asp:CheckBox ID="CB_ID" runat="server"    OnCheckedChanged="CB_CheckedChanged"  AutoPostBack="true"  />
        </EditItemTemplate>                   
    </asp:TemplateField>
    ...
</GridView>

protected void CB_radio_obligatoire_CheckedChanged(object sender, EventArgs e) 
{
    CheckBox checkbox = sender as CheckBox;
}

因此所有GridView的行都代表数据库项。 我的CB_radio_obligatoire_CheckedChanged方法需要调用storedProcedure并需要DB记录ID。

如何在此Gridview中设置和访问此记录ID?

我想最简单的方法是设置一个绑定到ID的隐藏字段。 如果是这样,这个隐藏的字段应该位于何处?作为GridView的隐藏列?在asp:TemplateField中?在ItemTemplate里面?

1 个答案:

答案 0 :(得分:1)

如果您知道行索引,则可以访问GridViewRow的{​​{1}}值。

protected void CB_ID_CheckedChanged(object sender, EventArgs e)
{
    //cast the sender back to the checkbox
    CheckBox cb = sender as CheckBox;

    //cast the namingcontainer of the checkbox back to a gridviewrow
    GridViewRow row = cb.NamingContainer as GridViewRow;

    //as one-liner
    GridViewRow row = (GridViewRow)((CheckBox)sender).NamingContainer;

    //get the datakeyname value from the correct row in the gridview
    int id = (int)GV.DataKeys[row.RowIndex]["Id"];    
}