2011-03-02 10 views
0

私の詳細ビューからコントロールをデータバインドでプログラム的に変更できるようにする必要があります。今はこのコードを使用していますが、「インデックスが範囲外です」というエラーが表示されています。詳細ビューからコントロールにプログラムでアクセスするにはどうすればよいですか?

Private Sub dtlApplication_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) Handles dtlApplication.DataBound 
    Dim resumeLink As HyperLink = dtlApplication.Rows.Item(0).FindControl("lnkResume") 
    resumeLink.NavigateUrl = "Resumes/" 
End Sub 

私もこれを試しましたが、オブジェクト参照がオブジェクトのインスタンスに設定されていません。

Private Sub dtlApplication_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) Handles dtlApplication.DataBound 
    Dim resumeLink As HyperLink = dtlApplication.FindControl("lnkResume") 
    resumeLink.NavigateUrl = "Resumes/" 
End Sub 

私はこの問題は、私は私のメインのGridView内の行を選択するまで、それはそれらを得ることはありませんので、ページが最初にロードするときたDetailsViewは、任意のコントロールを持っていないということかもしれないと思います。基本的には、ページが最初に読み込まれたときではなく、グリッドビューで行を選択するときにこのコードを実行しようとしています。それはそれかもしれませんか?もしそうなら、detailsviewデータバインドに含まれていなければ、このコードをどこで実行すべきですか?ここで

はたDetailsViewと、対応するデータソースのマークアップです:

<asp:DetailsView ID="dtlApplication" runat="server" AutoGenerateRows="false" 
         DataKeyNames="appID" DataSourceID="ds2" CellPadding="0" BorderColor="Transparent" 
         BorderWidth="0px" GridLines="None" HorizontalAlign="Left" Width="459" CssClass="dtlView"> 
         <Fields>         
          <asp:TemplateField showheader="false"> 
           <ItemTemplate> 

            <h3>Resume</h3> 

            <asp:HyperLink runat="server" ID="lnkResume" Text="View Resume &raquo;"></asp:HyperLink>           

           </ItemTemplate> 
          </asp:TemplateField>         
         </Fields> 
         <PagerSettings Mode="NextPreviousFirstLast" PageButtonCount="5" FirstPageText="&larr; First" LastPageText="Last &rarr;" 
          nextpagetext="Next &raquo;" previouspagetext="&laquo; Previous" /> 
         <PagerStyle BackColor="#2461BF" ForeColor="White" HorizontalAlign="Center" CssClass="paging" /> 
        </asp:DetailsView> 
<asp:SqlDataSource ID="ds2" runat="server" ConnectionString="<%$ ConnectionStrings:cn %>" 
         SelectCommandType="StoredProcedure" SelectCommand="sp_SelectApplicationDetail" 
         EnableCaching="true" CacheDuration="600"> 
         <SelectParameters> 
          <asp:ControlParameter Name="appID" ControlID="gvAdmin" PropertyName="SelectedValue"></asp:ControlParameter> 
         </SelectParameters>   
        </asp:SqlDataSource> 
+0

を入力してください。 – Alex

+0

マークアップで質問を更新しました –

答えて

1

たDetailsViewのデータソースには、それは選択だ制御パラメータとしてGridViewのSelectedValueのを使用して、ページのロード時にGridViewのはまだのselectedIndexを持っていないので、たDetailsViewは空です。問題を解決するために、ページの読み込み時にgridviewのselectedindexを設定する必要がありました。

0

データバインドイベントは、このような問題のための最高のイベントではないようです。代わりにItemCreated eventイベントハンドラを使用してください。ここのように、例えば:

Private Sub dtlApplication_ItemCreated(sender As Object, e As EventArgs) Handles dtlApplication.ItemCreated 

    Dim someRow As DetailsViewRow = dtlApplication.Rows(0); 
    If someRow Is Nothing Then Exit Sub  
    Dim link As HyperLink = DirectCast(someRow.FindControl("lnkResume"), HyperLink) 

    If link Is Nothing Then Exit Sub 

    link.NavigateUrl = "Resumes/" 
End 
+0

私はそれを試みましたが、それと同じエラーです。 Detailsviewのデータソースに、メインのgridviewのselectedvalueを使用してデータを取り込むことができますか? –

+0

それは可能ですが、実際にはresumeLinkには何もないとは確信していません。これは、データバインディングが明示的でないためです。 – apros

+0

私はあなたのコードを試しましたが、最初の行でこのエラーが出ています: "インデックスが範囲外です。コレクションのサイズよりも負でなくてはなりません。 パラメータ名:インデックス。これは、dtlApplicationにItemCreatedイベントの行がないことを示しています。そこに正しい道がありますか? –

0

detailsview visibleプロパティをfalseに設定することもできます。ページの読み込み時に、

関連する問題