需要帮助的人知道如何通过ID获取组件,我有一个循环,其中包含一些名为TextBox_1
,TextBox_2
,TextBox_3
,(...)的元素示例
我根据数据库返回的数据列表创建了一个循环。我试过像
这样的东西Dim count as Integer = 1
Dim TextBox As TextBox = Nothing
For Each dados In MyListData
TextBox = CType(Me.FindControl("TextBox_" & count), TextBox)
TextBox.Text = "My data"
count = count + 1
Next
在TextBox.Text = "My data"
中触发错误,向我显示TextBox是未定义的对象..在即时视图中返回Nothing
。
我的场景是一个使用MasterPage的表单,其中包含和使用一些UpdatePanels组件的ContentPlaceholders。我的TextBox位于Web窗体“内容”中,它对应于Master中设置的主要内容ContentPlaceHolder。一开始我以为我可以找到Me.FindControl的元素(如上所述)..我的失败,我尝试过Me.Form,Me.Page和Me.Control但没什么..
MasterPage就像:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" runat="server">
<!-- My header.. -->
</head>
<body onkeydown="return(event.keyCode!=13);">
<%--<% If (DesignMode) Then%>
<script src="Scripts/ASPxScriptIntelliSense.js" type="text/javascript"></script>
<% End If%>--%>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server" AsyncPostBackTimeout="900">
</asp:ScriptManager>
<div id="buttons">
<asp:UpdatePanel ID="UpdatePanel2" runat="server">
<ContentTemplate>
<asp:ContentPlaceHolder ID="Header" runat="server">
</asp:ContentPlaceHolder>
</ContentTemplate>
</asp:UpdatePanel>
</div>
<div id="container">
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:ContentPlaceHolder ID="Content" runat="server">
</asp:ContentPlaceHolder>
</ContentTemplate>
</asp:UpdatePanel>
</div>
</form>
</body>
</html>
表单标记采用以下结构:
<%@ Page Title="" Language="vb" AutoEventWireup="false" MasterPageFile="~/MyProject_Master.Master"
CodeBehind="Page.aspx.vb" Inherits="MyProject.MyForm" %>
<asp:Content ID="Content1" ContentPlaceHolderID="Header" runat="server">
<!-- Some static HTML -->
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="Content" runat="server">
<!-- The structure is like: -->
<table cellpadding="1" cellspacing="1" class="divLargura">
<tr>
<td><asp:Label ID="Label_1" runat="server"></asp:Label></td>
<td>
<asp:TextBox ID="TextBox_1" runat="server" ReadOnly="true" Width="97%" Height="18px" ClientIDMode="Static">
</asp:TextBox>
</td>
</tr>
<tr>
<td><asp:Label ID="Label_2" runat="server"></asp:Label></td>
<td>
<asp:TextBox ID="TextBox_2" runat="server" ReadOnly="true" Width="97%" Height="18px" ClientIDMode="Static">
</asp:TextBox>
</td>
</tr>
<tr>
<td><asp:Label ID="Label_3" runat="server"></asp:Label></td>
<td>
<asp:TextBox ID="TextBox_3" runat="server" ReadOnly="true" Width="97%" Height="18px" ClientIDMode="Static">
</asp:TextBox>
</td>
</tr>
<tr>
<td><asp:Label ID="Label_4" runat="server"></asp:Label></td>
<td>
<asp:TextBox ID="TextBox_4" runat="server" ReadOnly="true" Width="97%" Height="18px" ClientIDMode="Static">
</asp:TextBox>
</td>
</tr>
</table>
</asp:Content>
我做错了什么?与ReadOnly有任何关系吗?
答案 0 :(得分:1)
Me.FindControl()
正在使用Me
对象(整个表单)作为其搜索的起点。这不会在数据绑定控件内部工作,您可能在每个记录中有不同的控件实例。您必须在特定行的上下文中进行搜索,这只能在特定事件中进行。
为了提供最好的解决方案,我们需要了解您的上下文...这个代码在哪里运行,如何在ASPX标记中定义TextBox,以及{{1与最终出现在控件中的数据相关吗?
仍然没有足够的信息,但如果是我,我的内容区域看起来更像是这样:
listaEvolucaoAcao
然后我将<asp:Content ID="Content2" ContentPlaceHolderID="Content" runat="server">
<table cellpadding="1" cellspacing="1" class="divLargura">
<asp:Repeater runat="server" ID="Largura" ... >
<ItemTemplate>
<tr>
<td><asp:Label ID="rowLabel" runat="server"></asp:Label></td>
<td><asp:TextBox ID="rowTextBox" runat="server" ReadOnly="true"
Value='<%# Eval("Item.PropertyName") %>'
Width="97%" Height="18px"></asp:TextBox>
</td>
</tr>
</ItemTemplate>
</asp:Repeater>
</table>
</asp:Content>
对象设置为转发器的数据源。