我有一个gridview,我制作了一个带有复选框的模板列。
然后我想检查复选框的值。
我想在取消选中该行的复选框时将行的可见属性设置为false
。
无论我做什么,我总是得null
。
FindControl()
一定是个问题,但我认为这是完全正常的:
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
DbInteract dbi = new DbInteract("CONNECTION STRING");
GridView1.DataSource = dbi.SqlDA("select * from table");
GridView1.DataBind();
}
protected void ProsseguirBtn_Click(object sender, EventArgs e)
{
if (!IsPostBack)
{
foreach (GridViewRow row in GridView1.Rows)
{
CheckBox cb = (CheckBox)row.FindControl("chk");
if (!cb.Checked)
{
GridView1.Rows[row.RowIndex].Visible = false;
}
}
}
}
}
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:TemplateField>
<EditItemTemplate>
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
</EditItemTemplate>
<ItemTemplate>
<asp:CheckBox ID="chk" runat="server" />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="nome" HeaderText="jhf" />
</Columns>
</asp:GridView>
<asp:Button ID="ProsseguirBtn" runat="server" Text="Button"
onclick="ProsseguirBtn_Click" />
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
</div>
</form>
</body>
</html>
答案 0 :(得分:0)
FindControl不是递归的。换句话说,当您在行上调用FindControl时,它只会查看该行包含的直接控件。
GridViewRow不直接包含您的控件 - 它包含表格单元格,然后包含您的控件。因此FindControl将找不到您的复选框。
如果您不知道所需的列,则需要使用另一种方法,例如表格单元格上的foreach循环,或者编写FindControl的递归版本。您可以在我的old answer here中找到我有时使用的版本。
答案 1 :(得分:0)
为什么要检查!IsPostBack
?
我在没有!IsPostBack
检查的情况下尝试了此代码,并且正确找到了CheckBox,否则IsPostBack
为false,并且找不到CheckBox的代码。