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