如何通过ID或部分ID找到VB.Net WebForms组件?

时间:2016-09-06 17:46:05

标签: vb.net webforms components

需要帮助的人知道如何通过ID获取组件,我有一个循环,其中包含一些名为TextBox_1TextBox_2TextBox_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有任何关系吗?

1 个答案:

答案 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> 对象设置为转发器的数据源。