为什么FindControl无法使用我的中继器?

时间:2009-10-12 22:00:29

标签: c# asp.net repeater

我正在尝试更改在同一LinkBut​​ton的onclick事件期间嵌套在转发器的ItemTemplate部分内的一对服务器控件(特别是LinkBut​​ton和Label)的可见性。我实际上已经找到了解决方案,但我不明白它为什么会起作用,而不是我之前尝试过的方式。我最初的尝试如下:

嵌套在转发器的ItemTemplate中

<asp:LinkButton ID="lnAdd" CommandArgument='<%#Eval("index") %>' runat="server" Text="Add" OnClick="lnAdd_Click"> </asp:LinkButton>

<asp:Label Visible="false" runat="server" ID="videoAdded" Text="Video Added"></asp:Label>

然后在lnAdd_Click函数里面我有:

Repeater1.FindControl("lnAdd").Visible = false;
Repeater1.FindControl("videoAdded").Visible = true;

其中Repeater1是这些控件所在的转发器的id。这似乎什么都不做(虽然它编译)。我认为这是因为由于某些未知原因,找不到这些控件。

以下问题的最后答案是什么工作:Server controls in an asp.net repeater

解决方案似乎正在做一些我尝试过的非常相似的事情。它甚至在转发器上使用FindControl。唯一的区别(我能看到)是它通过发送者对象获得转发器。嗯,实际上,现在我想起来了。当实际运行的时候,.Net将这些元素的id改为像ctl00_ContentPlaceHolder1_Repeater1_ctl02_lnAdd这样的无意义,所以也许这就是为什么它找不到它。但与此同时,在工作解决方案中我只给出了像“lnAdd”这样的普通ID。 .Net会自动翻译吗?为什么它会为这个解决方案而做,而不是我最初尝试这样做的方式呢?

无论如何,我觉得这里有一些基本的东西,我不太理解,并会欣赏一些启示:D

2 个答案:

答案 0 :(得分:2)

使用Repeater1.FindControl(..)...的问题在于,您无法分辨哪个特定的Label或LinkBut​​ton被定位。它是一个转发器,因此每个这样的项目都被分配了一个唯一的标识符作为RepeaterItemCollection的一部分。在标记中,您将其命名为“lnAdd”,但这不是生成后的内容等。

作为参考,这里是你说的另一篇文章的代码:

protected void btnUpdate_OnClick(object sender, EventArgs e)
    {
        Button b = sender as Button;
        if (b != null)
        {
            RepeaterItem ri = b.Parent as RepeaterItem;
            if (ri != null)
            {
                string name = null;

                //Fetch data
                TextBox txtName = ri.FindControl("txtName") as TextBox;

我将解释上述原因的原因。首先,单击的按钮是从发送方对象转换而来的。我们知道它是一个按钮,因为它是Update按钮的单击处理程序。接下来,我们也知道按钮出现在转发器中,因此它的父级是RepeaterItem.这就是ri变量的初始化和转换方式。在ri可用的情况下,使用FindControl现在可以在中找到特定RepeaterItem 中的给定控件。

答案 1 :(得分:1)

您需要在包含单击按钮的RepeaterItem上调用FindControl,您可以在转发器的OnItemCommand处理程序中执行此操作,因此您将获得导致该命令的RepeaterItem实例。

您必须在转发器标头中添加OnItemCommand =“ProcessCommands”,然后添加ProcessCommand成员:

protected void ProcessCommands(object source, RepeaterCommandEventArgs e)
{
    LinkButton button = (LinkButton)e.Item.FindControl("lbAdd");
    button.Visible = false;
    ...
}

希望这有帮助