2012-02-23 77 views
0

我在同一頁面上有兩個Formviews。我可以在第一個沒有問題的情況下使用FindControl,但它在第二個上總是失敗。FormView.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"); 

這總是返回null。我已經閱讀了一百萬個關於在數據綁定完成之前不會呈現控件的博客,但是如果兩個FOrmView以相同的方式設置,結果應該是相同的。

任何幫助將非常apreciated :)

馬特:)

+0

我只是想補充一點,我還檢查SqlDataSources是否返回記錄,他們都是。 – 2012-02-23 15:33:36

+0

我注意到,當我遍歷代碼併到達'TextBox LicTextBox =(TextBox)FormView1.FindControl(「LicenseTextBox」);'調試器跳轉到aspx頁面並查看FormView1中的所有asp字段。當我到達'Label DLAppNameCode =(Label)DLFormView.FindControl(「DLAppNameLabel」);'代碼不會跳轉到aspx頁面,因此不會搜索任何asp控件。有人知道爲什麼 – 2012-02-27 12:06:52

+0

我已經嘗試了更多的東西,現在無濟於事。我曾嘗試將DLFormView首先放入aspx頁面,並嘗試在FormView1之前在DLFormView中查找標籤;我曾嘗試在頁面上的其他控件上使用FindControl,但即使在頁面級別也無法找到任何內容(此處的想法是查找標籤的父級,然後使用該對象查找標籤)。 FindControl只適用於FormView1,我無法解決原因。一些幫助將不勝感激。 :) – 2012-02-28 09:44:31

回答

0

我想懇求愚蠢和也提供一些背景如何,我用什麼我從我的愚蠢教訓。

我的DLFormView的SqlDataSource返回記錄,當然我偶然使用了稍微不同的值,因此沒有記錄被返回。我只是通過使表單視圖的ItemTemplate部分僅包含未綁定(基本上純文本)的數據來解決這個問題。沒有任何顯示,這指向頁面使用不同的tempalte。當我在EmptyDataTemplate中放置測試行時,它顯示出來,確認SqlDataSource沒有返回任何內容。也許一個學校男孩在開發過程中沒有在這個模板中加入某些東西。

碰巧我無論如何都需要使用EmptyDataTemplate,我只是沒有做到這一點。由於一次只能呈現一個模板,因此我可以在兩個模板中使用相同的ID名稱。這意味着不需要測試正在使用哪個模板。 (雖然DataItemsCount = 0時使用空模板,否則您可以測試其餘模板的CurrentMode。)

因此,我的一個很大的失敗,但我希望人們可以從我的錯誤中學習。

馬特:)

相關問題