2011-03-02 2 views
0

Мне нужно иметь возможность изменять элементы управления из моего детального описания программно на databind. Прямо сейчас я использую этот код, но у меня ошибка «Индекс был вне диапазона».Как получить доступ к элементу управления из описания деталей программно?

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 

Я думаю, что проблема может быть, что DetailsView не имеет каких-либо элементов управления, когда страница первоначально загружается, так как он не получает их, пока я не выбрать строку в моей основной GridView. В основном, я пытаюсь выполнить этот код, когда я выбираю строку в gridview, а не когда страница изначально загружается. Может ли это так? Если да, то где я должен выполнить этот код, если не в привязке данных detailview?

Вот 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

DataSource В DetailsView использует SelectedValue GridView как это выберите параметр управления, а также на странице загрузки GridView не имеет SelectedIndex еще, так что DetailsView пуст. Для исправления проблемы мне пришлось установить выбранный индекс gridview на загрузку страницы.

0

Кажется, что DataBound событие не является лучшим событием для такого вопроса. Вместо этого попробуйте использовать обработчик событий 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

Я пробовал это и по-прежнему ту же ошибку. Может ли быть, что источник данных для подробного обзора использует мое выделенное значение основного gridview для его заполнения? –

+0

Возможно, но я не уверен, что на resumeLink ничего не будет. Это связано с тем, что у него нет явной привязки данных. – apros

+0

Я пробовал ваш код, и я получил эту ошибку в первой строке: «Индекс был вне диапазона. Должен быть неотрицательным и меньше, чем размер коллекции. Имя параметра: индекс.» Это говорит мне, что dtlApplication не имеет никаких строк при событии ItemCreated. Я там на правильном пути? –

0

Вы также можете указать свойство видимости видимости на false На странице Загрузить событие

Смежные вопросы