2016-10-12 2 views
0

ВОПРОСНайти контроль в DataList HeaderTemplate

Как изменить значение элемента управления внутри шаблона заголовка в DataList на основе стоимости DataItem?

Я не могу изменить значение в ListItemType.HeaderItem, потому что я не знаю, какое значение установить его, пока не будет привязан ListItem.

ASP.NET

<asp:DataList ID="dl" runat="server" ShowHeader="true"> 
    <HeaderTemplate> 
    <asp:Label ID="lbl" runat="server" Text="MyText" /> 
    </HeaderTemplate> 
    <ItemTemplate> 

    </ItemTemplate> 
</asp:DataList> 

КОД ЗА

Protected Sub dl_ItemDataBound(sender As Object, e As DataListItemEventArgs) Handles dl.ItemDataBound 
    If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then 
     Dim Type As Integer = e.Item.DataItem("Type") 

     If Type = 0 Then 
     'Change lbl text in HeaderTemplate 
     End If 

    End If 
    End Sub 
+0

увидеть, если это помогает http://stackoverflow.com/questions/14933540/accessing -controls-in-datalist-headertemplate-from-codebehind –

+0

@AshleyJohn Спасибо, но я уже рассмотрел их. Я не могу использовать HeaderTemplate из-за моих точек, отмеченных в моем вопросе. – Obsidian

ответ

1

Использование ниже код:

Private headerItem As DataListItem 

    Protected Sub dl_ItemDataBound(sender As Object, e As DataListItemEventArgs) Handles dl.ItemDataBound 

      If e.Item.ItemType = ListItemType.Header Then 
       headerItem = e.Item 
      End If 
      If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then 
       Dim Type As Integer = e.Item.DataItem("Type") 

       If Type = 0 Then 
        Dim lbl As Label = CType(headerItem.FindControl("lbl"), Label) 
        lbl.Text = "New Text" 
       End If 

      End If 
    End Sub 
+0

Мне нравится эта идея. – Obsidian

1

Заголовок является одним из элементов, поэтому вам нужно пройти по списку элементов, найти заголовок один и используйте FindControl для получения метки. Проблема здесь, однако, в том, что в любой момент процесса связывания данных вы не можете быть уверены, что элемент заголовка уже привязан и метка существует. Обычно вы сначала обнаружите, что это привязка данных, но в API нет никакой гарантии, поэтому вы не должны полагаться на это поведение.

Итак, что бы вы могли сделать, это иметь поле класса для хранения необходимого вам текста, а затем установить этот текст в PreRender, когда привязка данных уже произошла. Что-то вроде этого (C#, но должно быть легко перевести на VB):

Private headerText as String 

Protected Sub dl_ItemDataBound(sender As Object, e As DataListItemEventArgs) Handles dl.ItemDataBound 
    If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then 
     Dim Type As Integer = e.Item.DataItem("Type") 

     If Type = 0 Then 
      headerText = "SomeText" 
     End If 

    End If 
End Sub 

Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender 
    Dim item As DataListItem 
    For Each item In dl.items 
     If item.ItemType = ListItemType.Header Then 
      Dim HeaderLabel As Label = _ 
       CType(item.FindControl("lbl"), Label) 
      HeaderLabel.Text = headerText 
    End If 
    Next item 
End Sub