FormView.FindControl работи за един формуляр, но не и за другия на същата страница

Имам два Formviews на една и съща страница. Мога да използвам 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>

И кодирането на 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 са настроени по един и същи начин, резултатът трябва да е същият.

Всяка помощ ще бъде много ценена :)

Мат :)


person Matty W    schedule 23.02.2012    source източник
comment
Бих искал само да добавя, че също проверих дали SqlDataSources връщат записи и и двата са.   -  person Matty W    schedule 23.02.2012
comment
Забелязах, че когато премина през кода и стигна до TextBox LicTextBox = (TextBox)FormView1.FindControl("LicenseTextBox");, дебъгерът прескача в aspx страницата и преглежда всички asp полета във FormView1. Когато достигна Label DLAppNameCode = (Label)DLFormView.FindControl("DLAppNameLabel"); Кодът не прескача към aspx страницата adn, следователно не търси никакви asp контроли. Някой да знае защо?   -  person Matty W    schedule 27.02.2012
comment
Сега опитах още няколко неща, но без резултат. Опитах се да поставя DLFormView първо в aspx страницата и се опитвах да намеря етикета в DLFormView преди FormView1; Опитах се да използвам FindControl на други контроли на страницата, но той изобщо не намира никакви, дори на ниво страница (Тази идея тук беше да се намери родителят на етикета и след това да се използва този обект, за да се намери етикетът). FindControl работи само за FormView1 и не мога да разбера защо. Някаква помощ ще бъде много ценена. :)   -  person Matty W    schedule 28.02.2012


Отговори (1)


Бих искал да се оправдая за глупостта, но също така да осигуря известна предистория за това как съм използвал това, което съм научил от глупостта си.

Моят SqlDataSource за DLFormView връщаше записи, разбира се, след това случайно използвах малко по-различни стойности и така не бяха върнати записи. Разбрах това само като направих секцията ItemTemplate на изгледа на формуляр да съдържа само необвързани (основно обикновен текст) данни. Тъй като нищо не се показва, това сочи към страницата, използвайки различен tempalte. Когато поставих тестов ред в EmptyDataTemplate, той се показва, потвърждавайки, че няма нищо върнато от SqlDataSource. Може би грешка на School boy, която не е поставила нещо в този шаблон по време на разработката.

Както се случва, така или иначе трябва да използвам EmptyDataTemplate, просто не бях стигнал дотук. Тъй като наведнъж се изобразява само един шаблон, успях да използвам едни и същи имена на идентификатори и в двата шаблона. Това означава, че няма нужда да се тества кой шаблон се използва. (въпреки че се използва празен шаблон, когато DataItemsCount = 0, в противен случай можете да тествате CurrentMode за останалите шаблони.)

Така че голям провал от моя страна, но се надявам хората да се поучат от грешката ми.

Мат :)

person Matty W    schedule 01.03.2012