2011-03-02 2 views
0

데이터 뷰에서 프로그래밍 방식으로 내 detailsview에서 컨트롤을 수정할 수 있어야합니다. 지금이 코드를 사용하고 있지만 "인덱스가 범위를 벗어났습니다."오류가 발생합니다.프로그래밍 방식으로 detailsview에서 컨트롤에 액세스하려면 어떻게합니까?

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 어떤 컨트롤이되지 않는 것 같아요. 기본적으로, 내가 gridview에서 행을 선택할 때이 코드를 실행하려고하는데, 페이지가 처음로드 될 때가 아닙니다. 그게 될 수 있을까요? 그렇다면 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를 설정해야했습니다.

0

바인딩 이벤트는 문제에 대한 최선의 이벤트없는 것 같다 :

다음은 위해 DetailsView 및 해당 데이터 소스 마크 업입니다. 대신 ItemCreated event 이벤트 처리기를 사용해보십시오. 여기에, 예를 들어 마찬가지로 : 그것은 선택 제어 매개 변수, 그리고 페이지에 아직에도 selectedIndex이없는 gridview에로드, 그래서 위해 DetailsView이 비어로

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로 설정할 수도 있습니다. 페이지로드시