使用system.web.UI.Control.FindControl检索多个控件
本文关键字:检索 控件 FindControl Control system web UI 使用 | 更新日期: 2023-09-27 18:29:58
我有一个带中继器的网页。目前我有一个单一的中继器,显示我所有的文章
<asp:repeater runat="server" ID="rptArticles" DataSource="<%# CurrentArticles %>">
do something
在所有这些文章中都有一些复选框,您可以使用这些复选框来检查文章并对它们执行一些操作。
要检索并返回复选框,我有以下方法
Protected ReadOnly Property ArticleRepeater As Repeater
Get
Return DirectCast(FindControl("rptArticles"), Repeater)
End Get
End Property
Protected Overridable Function GetSelectedArticles() As String
Dim Checkboxes As HtmlInputCheckBox() = DataConvert.FindControlsByType(Of HtmlInputCheckBox)(ArticleRepeater, True)
Dim SelectedValues As String() = (From cbx In Checkboxes Where cbx.Checked Select cbx.Value).ToArray
Return String.Join(";", SelectedValues)
End Function
这些方法目前做得很好。
但现在我想对我的文章进行更多的过滤,所以我在最初的中继器中有一个中继器,它过滤它们,只显示它们的特定过滤器。所以我的代码现在是这样的。
<asp:repeater runat="server" ID="rptArticles" DataSource="<%# CurrentArticles %>">
<asp:repeater runat="server" ID="childRepeater" DataSource="<%# Filter(Container.DataItem) %>">
do something
但是现在我的GetSelectedArticles函数已经不起作用了。rptArticles中继器不再控制复选框,因此我无法检索它们。
有人知道我如何更换属性"ArticleRepeater",以便我可以再次使用它,或者它返回子中继器吗?
注意:我已经试过交换名称,但因为我有多个子中继器,findcontrol函数不再工作。
答案可以在VB.Net或C#中给出。我可以很容易地转换这些语言
编辑:我忘了提。它仍然需要为使用旧的单中继器的遗留代码工作
以下是我对如何解决这一问题的建议。请注意,我以前从未见过这种FindControlsByType
方法,所以我假设您使用的是与此类似的方法(取自此处):
public static List<T> FindControlsByType<T>(this Control ctrl)
{
return ctrl.GetChildren().OfType<T>().ToList();
}
这个版本缺少第二个参数boolean,我还不清楚它的用途
这个想法是检索所有子中继器,然后为每个子中继器检索里面的复选框。综合起来,应该会给你rptArticles
:内的所有复选框
var childRepeaters = DataConvert.FindControlsByType<Repeater>(ArticleRepeater);
var checkboxes = childRepeaters.SelectMany(r => DataConvert.FindControlsByType<HtmlInputCheckBox>(r)).ToList();
请注意,此代码使用的是LINQ的SelectMany
。checkboxes
现在应该包含外部中继器内部的所有复选框