您好,感谢您抽出宝贵时间帮助我。
我试图更改位于转发器内的文本框的文本。
<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";
但如果我运行代码,我会收到此错误:对象引用未设置为对象的实例。
如果有人能告诉我自己做错了什么,那会很高兴。答案 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;