Найти элемент управления в 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

2 ответа

Решение

Используйте код ниже:

  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

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