FormView.FindControl работает для одной формы, но не для другой на той же странице - PullRequest
0 голосов
/ 23 февраля 2012

У меня есть два Formviews на одной странице.Я могу использовать FindControl на первом без проблем, но он всегда дает сбой на втором.

Я использую ItemTemplate для обоих, оба по умолчанию для ReadOnly, оба связаны с 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>

И кодировка FindControlвыглядит следующим образом ...

TextBox LicTextBox = (TextBox)FormView1.FindControl("LicenseTextBox");
HiddenField AppLocCode = (HiddenField)FormView1.FindControl("AppLocation");
Label AppNameCode = (Label)FormView1.FindControl("AppNameLabel");

Это всегда работает ...

Label DLAppNameCode = (Label)DLFormView.FindControl("DLAppNameLabel");

Это всегда возвращает ноль.Я прочитал миллион статей о том, что элементы управления не будут отображаться до тех пор, пока привязка данных не будет завершена, но, безусловно, если два FOrmView настроены одинаково, результат должен быть одинаковым.

Любая помощь будет высоко оценена:)

Мэтт:)

1 Ответ

0 голосов
/ 01 марта 2012

Я хотел бы заявить о глупости, а также предоставить некоторые сведения о том, как я использовал то, чему научился из своей глупости.

Мой SqlDataSource для DLFormView возвращал записи, конечно, тогда я случайно использовал немного другие значения, поэтому записи не возвращались. Я понял это только благодаря тому, что раздел ItemTemplate представления формы содержит только несвязанные (в основном простой текст) данные. Поскольку ничего не отображалось, это указывало на страницу с использованием другого tempalte. Когда я поместил тестовую строку в EmptyDataTemplate, он отобразился, подтверждая, что SqlDataSource ничего не возвращал. Возможно, ошибка школьника не помещает что-то в этот шаблон во время разработки.

Поскольку это происходит, мне все равно нужно использовать EmptyDataTemplate, я просто не дошел до этого момента. Поскольку за один раз отображается только один шаблон, я смог использовать одинаковые имена идентификаторов в обоих шаблонах. Это означает, что нет необходимости проверять, какой шаблон используется. (хотя используется пустой шаблон, когда DataItemsCount = 0, в противном случае вы можете проверить CurrentMode для остальных шаблонов.)

Так что с моей стороны большая ошибка, но я надеюсь, что люди могут извлечь уроки из моей ошибки.

Matt:)

...