1

我绞尽脑汁尝试访问用户选择复选框的网格视图的 ID 列:

<asp:GridView ID="gvUserFiles" runat="server">
            <Columns>
            <asp:TemplateField HeaderText="Select" ItemStyle-HorizontalAlign="Center" >
                <ItemTemplate>
                    <asp:CheckBox  ID="chkSelect" runat="server" />
                </ItemTemplate>
            </asp:TemplateField>
            </Columns>
        </asp:GridView>

gridview 列是 chkSelect(复选框)、Id、fileName、CreateDate

当用户选中复选框并按下按钮时,我想接收“id”列值。

这是我的按钮代码:

foreach (GridViewRow row in gvUserFiles.Rows)
            {
                var test1 = row.Cells[0].FindControl("chkSelect");
                CheckBox cb = (CheckBox)(row.Cells[0].FindControl("chkSelect"));
                //chk = (CheckBox)(rowItem.Cells[0].FindControl("chk1"));  
                if (cb != null && cb.Checked)
                {
                    bool test = true;

                }
            }

cb.checked 总是返回 false。

4

2 回答 2

3

始终未选中的复选框可能是 DataBinding 的问题。确保在GridView调用按钮单击事件之前没有 DataBinding。有时人们将 DataBinding 粘贴在Page_load事件上,然后将 DataBinding 保留在每个PostBack. 因为它在按钮点击之前被调用,它可以产生直接的影响。当GridViewis DataBound 时,您将丢失来自页面的所有状态。

如果您在GridView上进行数据绑定,请将其Page_load包装起来以验证!IsPostBack

if (!IsPostBack)
{
    gvUserFiles.DataSource = data;
    gvUserFiles.DataBind();
}

如果这不是您的情况,您可以尝试根据Request.Form值验证选中的属性:

protected void button_OnClick(object sender, EventArgs e)
{
    foreach (GridViewRow row in gvUserFiles.Rows)
    {
        CheckBox cb = (CheckBox)row.FindControl("chkSelect");

        if (cb != null)
        {
            bool ckbChecked = Request.Form[cb.UniqueID] == "on";

            if (ckbChecked)
            {
                //do stuff
            }
        }
    }
}

a的CheckedCheckBox由浏览器作为 value 发送"on"。如果没有在浏览器中检查它,那么请求就不会发生任何事情。

于 2013-03-03T14:33:03.277 回答
1

您可以像这样使用 datakey 来实现它

将 Datakey 添加到您的网格视图

<asp:GridView ID="gvUserFiles" runat="server" DataKeyNames="Id">

并像这样获得服务器端

string value = Convert.ToString(this.gvUserFiles.DataKeys[rowIndex]["Id"]);
于 2013-03-03T14:26:52.093 回答