ASP.NET 复选框在中继器中被选中
本文关键字:中继器 NET 复选框 ASP | 更新日期: 2023-09-27 18:34:45
>我有一个带有html表的中继器。在 html 表中,我有一个带有复选框的表格单元格。
我试图在单击按钮后从用户那里获取选中的行,但结果始终为空。
asp.net 标记:
<table id="tbl1" class="table">
<tr>
<th>test 1</th>
<th>test 2</th>
<th>test 3</th>
<th>test 4</th>
<th>Select</th>
</tr>
<asp:Repeater ID="rep" runat="server">
<ItemTemplate>
<tr id="tr1" runat="server">
<td>
<asp:Label ID="lbl1" runat="server" Text='<%#Eval("test1") %>'>' ></asp:Label>
</td>
<td>
<asp:Label ID="lbl2" runat="server" Text='<%#Eval("test2") %>'>' ></asp:Label>
</td>
<td>
<asp:Label ID="lbl3" runat="server" Text='<%#Eval("test3") %>'>' ></asp:Label>
</td>
<td>
<asp:Label ID="lbl4" runat="server" Text='<%#Eval("test4") %>'>' ></asp:Label>
</td>
<td id="td1" runat="server">
<asp:CheckBox ID="Select" runat="server" />
</td>
</tr>
</ItemTemplate>
</asp:Repeater>
</table>
<asp:Button ID="btnSelect" runat="server" Text="Go" OnClick="btnSelect_Click" />
C# 代码:
protected void btnSelect_Click(object sender, EventArgs e)
{
foreach (RepeaterItem rpt in rep.Items)
{
CheckBox ckb = (CheckBox)rpt.FindControl("Select");
if (ckb.Checked) // Always Null
{
//
}
else
{
//
}
}
}
问题是您在转发器项中具有另一个服务器控件。复选框不直接位于转发器项中,而是位于表行中。您可以像这样提取复选框
CheckBox ckb = (CheckBox)rpt.FindControl("tr1").FindControl("Select");
if (ckb.Checked)
...
当然,这很糟糕,因为更改布局会破坏您的代码。为了解决这个问题,你可以编写一个递归的FindControl,但它需要更多的工作。
是否在
回发上重新绑定转发器的数据源?这将导致重置转发器中所有控件的状态。
问题可能是rpt.FindControl("Select")
只搜索rpt
的孩子。你可以试试这个:
/// <summary>
/// Iterates throug all children and returns all of Type T.
/// </summary>
public static List<T> FindChildrenOfType<T>(Control control) where T : class
{
List<T> controls = new List<T>();
foreach (Control childControl in control.Controls)
{
if (childControl.Controls.Count > 0)
{
controls.AddRange(FindChildrenOfType<T>(childControl, comp));
}
if (childControl is T)
{
controls.Add(childControl as T);
}
}
return controls;
}
像这样使用它:
var checkboxes = FindChildrenOfType<CheckBox>(rpt);
你可以试试这个....
Aspx 代码:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<asp:Repeater ID="Repeater1" runat="server" >
<ItemTemplate>
<div>
<asp:CheckBox ID="CategoryID" runat="server" Text='<%# Eval("val") %>' />
</div>
</ItemTemplate>
</asp:Repeater>
<asp:Button Text="Click" OnClick="Button2_Click" runat="server" />
</form>
</body>
</html>
CS 代码:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
DataTable dt = new DataTable();
dt.Columns.Add("val", typeof(string));
for (int i = 0; i < 10; i++)
dt.Rows.Add("testing" + i.ToString());
Repeater1.DataSource = dt;
Repeater1.DataBind();
}
}
protected void Button2_Click(object sender, EventArgs e)
{
string Rpt = "Repeater Items Checked:<br />";
for (int i = 0; i < Repeater1.Items.Count; i++)
{
CheckBox chk = (CheckBox)Repeater1.Items[i].FindControl("CategoryID");
if (chk.Checked)
{
Rpt += (chk.Text + "<br />");
}
}
Response.Write(Rpt);
}
参考: http://www.codeproject.com/Questions/534719/GetplusSelectedplusCheckboxesplusinplusASPplusRepe