我试图访问gridview的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。
答案 0 :(得分:3)
始终取消选中复选框可能是DataBinding的问题。在调用按钮单击事件之前,请确保不是GridView
的DataBinding。有时人们会在Page_load
事件上粘贴DataBinding,然后在每个PostBack
上保留DataBinding。在点击按钮之前调用它可以直接影响。
当GridView
是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
}
}
}
}
浏览器会将Checked
的{{1}}值作为值CheckBox
发送。如果未在浏览器中检查,则请求中没有任何内容。
答案 1 :(得分:1)
你可以使用像这样的数据键
来实现它将Datakey添加到gridview
<asp:GridView ID="gvUserFiles" runat="server" DataKeyNames="Id">
并像这样获得服务器端
string value = Convert.ToString(this.gvUserFiles.DataKeys[rowIndex]["Id"]);