2012-02-23 24 views
0

同じページに2つのFormviewがあります。最初は問題なくFindControlを使うことができますが、常に2番目のもので失敗します。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を返します。私は、データバインディングが完了するまでレンダリングされないコントロールについて百万分の一を読んだが、確かに2つのFOrmViewsが同じ方法で設定されている場合、結果は同じになるはずです。

すべてのヘルプは非常にapreciatedされるだろう:)

マットを:)

+0

私はちょうど私もSqlDataSourcesレコードを戻ってきているし、彼らの両方があるかどうかをチェックしたことを追加したいと思います。 –

+0

コードをステップ実行してTextBoxにアクセスしたときに気付いたことがあるLicTextBox =(TextBox)FormView1.FindControl( "LicenseTextBox"); 'デバッガはaspxページにジャンプし、FormView1のすべてのASPフィールドを調べます。私が 'Label DLAppNameCode =(Label)に到達すると、DLFormView.FindControl(" DLAppNameLabel ");'コードはaspxページにジャンプせず、したがってadpコントロールを検索しません。誰でも知っている理由は? –

+0

私はもう役に立たないことをいくつか試しました。私はaspxページにDLFormViewを置いて、FormView1の前にDLFormViewでラベルを見つけようとしました。私はページ上の他のコントロールでFindControlを使用しようとしましたが、ページレベルであっても、まったく見つからないでしょう(このアイデアはラベルの親を見つけてそのオブジェクトを使ってラベルを見つけることでした)。 FindControlはFormView1でのみ機能し、私はその理由を調べることができません。助けていただければ幸いです。 :) –

答えて

0
私は愚かさを弁護しても、私は私が私の愚かさから学んだことを使ってきたどのようにいくつかの背景を提供したいと思い

DLFormView用のSqlDataSourceがレコードを返すようになっていましたが、偶然、わずかに異なる値を使用していたため、レコードは返されませんでした。フォームビューのItemTemplateセクションに、アンバウンド(基本的にはプレーンテキスト)データのみが含まれるようにして、これを理解しました。表示されていないので、これは別のテンペラを使ってページを指していました。 EmptyDataTemplateにテスト行を挿入すると、SqlDataSourceによって返されたものがないことが確認されます。おそらく、スクールボーイのエラーは、開発中にこのテンプレートに何かを入れていないことでしょう。

とにかくEmptyDataTemplateを使用する必要がありますが、私はこの時点までは得られませんでした。一度に1つのテンプレートしかレンダリングされないので、両方のテンプレートで同じID名を使用することができました。つまり、どのテンプレートが使用されているかをテストする必要はありません。 (ただし、DataItemsCount = 0の場合は空のテンプレートが使用されますが、それ以外の場合は残りのテンプレートのCurrentModeをテストできます)。

大きな失敗は私の側にあります。

マット:)

関連する問題