我一直在尝试理解ASP中的ListView对象,但我无法以编程方式获取所选复选框或迭代它们。以下是我在SO上看到的最常用的两种方法,但到目前为止,我尝试的所有方法似乎都不适合我。
非常感谢任何帮助。
.ASPX Page
<asp:ListView ID="courseListView" runat="server">
<LayoutTemplate>
<table><asp:PlaceHolder runat="server" ID="itemPlaceholder">
</asp:PlaceHolder></table>
</LayoutTemplate>
<ItemTemplate>
<tr>
<td><asp:CheckBox ID="courseIdchk" Text='<%# Eval("CourseId") %>' runat="server" /></td>
<td><asp:Label ID="courseTitleLbl" Text='<%# Eval("title") %>' runat="server" /></td>
</tr>
</ItemTemplate>
</asp:ListView>
.CS代码背后
//Method #1
string result = string.Join(", ", courseListView.Controls.OfType<CheckBox>()
.Select(chk => chk.Text));
string result = "";
//Method #2
foreach (CheckBox ctrl in courseListView.Controls.OfType<CheckBox>())
{
result2 += ctrl.Text;
}
Response.Write("<p>The result is " + result);
Response.Write("<p>The result is " + result2);
Response.End();
答案 0 :(得分:0)
我不在Visual Studio附近,但在我的脑海中,我看到了两个没有迭代的原因。
1.您应该使用OnLoad
方法将此ListView绑定到源:
if (!IsPostback) {
courseListView.DataSource = GetCourses();
courseListView.DataBind();
}
2。 courseListView.Controls
不包含CheckBox
类型的项目,因此OfType<CheckBox>()
会过滤掉所有元素。如果你调试并在foreach (CheckBox ctrl in courseListView.Controls.OfType<CheckBox>())
上放置一个断点,你会看到CheckBox
是courseListView的子子节点之一。所以根据哪个控件包含CheckBoxes来编写适当的逻辑来构建你的逻辑:
var checkBox = courseListView.Controls.Cast<Control>().First().FindControl("courseIdchk");
同样,上面的代码假定复选框是控件的子级,它是courseListView
的唯一子级。
<强>更新强>
var findCheckedQuery = courseListView.Controls[0]
.Controls
.Cast<Control>()
.Select(ctrl => ctrl.FindControl("chkBox") as CheckBox)
.Where(chk => chk != null && chk.Checked);
result = string.Join(":", findCheckedQuery.Select(x => x.Text).ToArray());
<强> UPDATE2 强>
ASPX:
<asp:Repeater ID="courseListView" runat="server">
<ItemTemplate>
<asp:CheckBox ID="chkBox" data-id="<%#((Course)Container.DataItem).CourseId %>" Text="<%#((Course)Container.DataItem).Title %>" runat="server" />
<br/>
</ItemTemplate>
</asp:Repeater>
<asp:Button runat="server" UseSubmitBehavior="True" Text="Submit"/>
代码隐藏:
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
if (!IsPostBack)
{
courseListView.DataSource = GetCourses();
courseListView.DataBind();
}
else
{
var result = string.Empty;
var findCheckedQuery = courseListView
.Controls
.Cast<Control>()
.Select(x => (CheckBox)x.FindControl("chkBox"))
.Where(x => x.Checked)
.Select(x => x.Text);
result = string.Join(", ", findCheckedQuery.ToArray());
}
}