Asp.net FormView.FindControl适用于一个表单,但不适用于同一页面上的另一个表单

Asp.net FormView.FindControl适用于一个表单,但不适用于同一页面上的另一个表单,asp.net,formview,findcontrol,Asp.net,Formview,Findcontrol,我在同一页上有两个FormView。我可以在第一次使用FindControl而不会出现问题,但在第二次使用FindControl时总是失败 我对这两个都使用ItemTemplate,都默认为只读,都绑定到SQLDataSources(不同的),但我一辈子都搞不清楚FindControl为什么对其中一个有效而对另一个无效 我已经从下面的代码中删除了很多纯文本 <asp:SqlDataSource ID="SqlDataSource1" runat="server"

我在同一页上有两个FormView。我可以在第一次使用FindControl而不会出现问题,但在第二次使用FindControl时总是失败

我对这两个都使用ItemTemplate,都默认为只读,都绑定到SQLDataSources(不同的),但我一辈子都搞不清楚FindControl为什么对其中一个有效而对另一个无效

我已经从下面的代码中删除了很多纯文本

<asp:SqlDataSource ID="SqlDataSource1" runat="server" 
            ConnectionString="<%$ ConnectionStrings:SoftSaleDBConnectionString %>" 
            SelectCommand="SELECT * FROM [Apps] WHERE ([AppID] = @AppID)" >
        <SelectParameters>
            <asp:FormParameter FormField="AppID" Name="AppID" Type="Int32" />
        </SelectParameters>
    </asp:SqlDataSource>
    <asp:FormView ID="FormView1" runat="server" DataKeyNames="AppID" 
        DataSourceID="SqlDataSource1">
        <ItemTemplate>
            <h1>
                <asp:Label ID="AppNameLabel" runat="server" Text='<%# Bind("AppName") %>' /> 
                <asp:Label ID="VersionLabel" runat="server" Text='<%# Bind("Version") %>' /> for
                <asp:Label ID="OSLabel" runat="server" Text='<%# Bind("OS") %>' />
            </h1>
            <p>Text here</p>
            <p><asp:TextBox ID="LicenseTextBox" runat="server"
            Text='<%# Eval("License")%>'
            TextMode="MultiLine"  Width="800px" Rows="25" ReadOnly="True"></asp:TextBox></p>

            <asp:HiddenField ID="AppLocation" runat="server" ViewStateMode="Inherit" Value='<%# Bind("AppLocation") %>'/>
        </ItemTemplate>
    </asp:FormView>

    <p><asp:Literal ID="SizeLiteral" runat="server"></asp:Literal></p>

    <asp:SqlDataSource ID="SqlDataSource4" runat="server" 
        ConnectionString="<%$ ConnectionStrings:SoftSaleDBConnectionString %>" 
        SelectCommand="SELECT * FROM [Installations] WHERE (([AppID] = @AppID) AND ([Username] = @Username))" >
        <SelectParameters>
            <asp:FormParameter FormField="AppID" Name="AppID" Type="Int32" />
            <asp:FormParameter FormField="Username" Name="Username" Type="String" />
        </SelectParameters>
    </asp:SqlDataSource>

    <asp:FormView ID="DLFormView" runat="server" DataSourceID="SqlDataSource4" 
        DataKeyNames="AppID,Username">
        <ItemTemplate>
            <p> <asp:Label ID="DLAppNameLabel" runat="server" /> 
                <br />
                <br />
                <asp:Label ID="NumberOfInstallations" runat="server" Text='<%# Bind("Installations") %>'></asp:Label>
                <br />
                <asp:HiddenField ID="TotalInstallations" runat="server" />
                Number of New Installations: 
                <asp:DropDownList ID="NumberOfNewInstallations" runat="server">
                </asp:DropDownList>
                <br />
                <asp:Label ID="TotalNumberOfInstallations" runat="server" Text="Label"></asp:Label>
            </p>
        </ItemTemplate>
    </asp:FormView>
这些总是有用的

Label DLAppNameCode = (Label)DLFormView.FindControl("DLAppNameLabel");
这总是返回null。我已经读过一百万篇关于控件在数据绑定完成后才会呈现的博斯特文章,但是如果两个FormView的设置方式相同,那么结果肯定是一样的

任何帮助都将非常感激:)


马特:)

我想为自己的愚蠢辩护,但同时也提供一些背景资料,说明我是如何运用从愚蠢中学到的东西的

我的DLFormView的SqlDataSource正在返回记录,当然,后来我偶然使用了稍微不同的值,所以没有返回任何记录。我只是通过使表单视图的ItemTemplate部分只包含未绑定(基本上是纯文本)数据来解决这个问题。由于未显示任何内容,因此使用不同的温度指向页面。当我在EmptyDataTemplate中放置一个测试行时,它显示出来,确认SqlDataSource没有返回任何内容。可能是因为在开发过程中没有将某些内容放入此模板中而导致的学童错误

碰巧我需要使用EmptyDataTemplate,但我还没有做到这一点。由于一次只呈现一个模板,因此我能够在两个模板中使用相同的ID名称。这意味着不需要测试使用哪个模板。(尽管在DataItemsCount=0时使用空模板,否则您可以测试其余模板的CurrentMode。)

所以我是个大失败,但我希望人们能从我的错误中吸取教训


马特:)

我想补充一点,我还检查了SqlDataSources是否返回了记录,它们都返回了记录。我注意到,当我一步一步浏览代码并到达
TextBox-LicTextBox=(TextBox)FormView1.FindControl(“LicenseTextBox”)调试器跳入aspx页面并查看FormView1中的所有asp字段。当我到达
Label DLAppNameCode=(Label)DLFormView.FindControl(“dlappnamelab”)代码不会跳转到aspx页面,因此不会搜索任何asp控件。有人知道为什么吗?我又试了几次,但都没用。我曾尝试将DLFormView放在aspx页面的第一位,并尝试在DLFormView中找到FormView1之前的标签;我曾尝试在页面上的其他控件上使用FindControl,但它根本找不到任何控件,即使在页面级别也是如此(这里的想法是找到标签的父级,然后使用该对象来查找标签)。FindControl只适用于FormView1,我不知道为什么。如果您能提供一些帮助,我们将不胜感激。:)
Label DLAppNameCode = (Label)DLFormView.FindControl("DLAppNameLabel");