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

問題は、メインのグリッドビューで行を選択するまでコントロールが取得されないため、ページが最初に読み込まれたときに詳細ビューにコントロールがないことだと思います。基本的に、ページが最初に読み込まれたときではなく、グリッドビューで行を選択したときにこのコードを実行しようとしています。それはそれでしょうか?もしそうなら、データバインドされた詳細ビューにない場合、どこでこのコードを実行する必要がありますか?

詳細ビューと対応するデータソース マークアップは次のとおりです。

<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>
4

3 に答える 3

1

詳細ビューのデータソースは、選択コントロール パラメーターとしてグリッドビューの selectedvalue を使用します。ページの読み込み時には、グリッドビューにはまだ選択されたインデックスがないため、詳細ビューは空です。問題を解決するには、ページの読み込み時にグリッドビューの selectedindex を設定する必要がありました。

于 2011-03-04T14:36:18.853 に答える
0

詳細ビューの表示プロパティをページの読み込みイベントで false に設定することもできます

于 2012-05-30T19:06:48.723 に答える
0

DataBound イベントは、このような問題に最適なイベントではないようです。代わりにItemCreated イベントイベント ハンドラーを使用してみてください。たとえば、次のようにします。

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
于 2011-03-02T20:04:48.863 に答える