无法更改转发器内文本框的文本/值

时间:2014-05-10 13:57:58

标签: c# asp.net repeater

您好,感谢您抽出宝贵时间帮助我。

我试图更改位于转发器内的文本框的文本。

<asp:Repeater runat="server" ID="rpCategories">
                        <HeaderTemplate>
                            <ul id="nav_down" class="nav_down">
                        </HeaderTemplate>
                        <ItemTemplate>
                            <li><a href="<%# Eval("ID", "/products.aspx?id={0}") %>"><%# Eval("Title") %></a></li>
                        </ItemTemplate>
                        <FooterTemplate>
                            <li><a href="#"></a></li>
                            <li><a href="#">Contact</a></li>
                            <li><a id="cart_logo"></a>
                                <asp:Panel runat="server" ID="pnlBasket">
                                    <asp:textbox runat="server" id="txtTotalCount" Enabled="false" CssClass="ltTotalCount"></asp:textbox>
                                </asp:Panel>
                            </li>
                            </ul>
                        </FooterTemplate>
                    </asp:Repeater>

它是带有id =&#34; txtTotalCount&#34;的asp:文本框;我想改变文本。

这是我的C#代码:

TextBox ltTotalCount = (TextBox)FindControl("lblTotalCount");
ltTotalCount.Text = "1";

但如果我运行代码,我会收到此错误:对象引用未设置为对象的实例。

如果有人能告诉我自己做错了什么,那会很高兴。

3 个答案:

答案 0 :(得分:0)

Becuase lblTotalCount位于父控件内 - 转发器,您必须通过转发器引用它。

你应该能够在FindControl之前添加转发器的id,就像这样...

TextBox ltTotalCount =(TextBox)rpCategories.FindControl(“lblTotalCount”);

答案 1 :(得分:0)

您必须指定转发器作为查找文本框的父控件,并且因为它的转发器很可能有多个具有该ID的文本框,因此您必须指定哪个转发器项目看起来像这样:

TextBox ltTotalCount = rpCategories.Items[0].FindControl("txtTotalCount") as TextBox;

这将返回转发器第一行中的文本框。 你应该使用Id值而不是CssClass值

答案 2 :(得分:-1)

ID可能正在“增强”,以防止呈现的HTML中出现重复的ID。您可以通过查看html来验证这一点。

您可以将其添加到文本框中:ClientIDMode="Static"以使ID保持不变。

您收到错误是因为FindControl返回null但您仍尝试访问它。

[编辑]有人指出这不应该奏效。我同意,这是有效的:

Control FooterTemplate = rpCategories.Controls[rpCategories.Controls.Count - 1].Controls[0];

TextBox MyTextBox = FooterTemplate.FindControl("txtTotalCount") as TextBox;