我们在使用DataList时常常用到ItemDataBound事件,但是这次我在使用中
e.Item.FindControl失效了,在DataList中放置的一个HyperLink控件,
通过e.Item.FindControl怎么也找不到了,我查看代码,没有错误,
最后才发现只要在HTML部分含有<HeaderTemplate></HeaderTemplate>就会失效,
删除后正常。查了资料,没找到(不想找了)
HTML Part:
<asp:datalist id="DataList1" style="Z-INDEX: 101; LEFT: 8px; POSITION: absolute; TOP: 16px" runat="server"
Width ="584px" Height="208px">
<HeaderTemplate>
<!--错误就在这里 begine-->
</HeaderTemplate>
<ItemTemplate>
<!--错误就在这里 end-->
<asp:HyperLink id=HyperLink1 runat="server" Width="520px" Text='<%# DataBinder.Eval(Container.dataItem,"companyName") %> '>
</asp:HyperLink>
</ItemTemplate>
</asp:datalist>
Width ="584px" Height="208px">
<HeaderTemplate>
<!--错误就在这里 begine-->
</HeaderTemplate>
<ItemTemplate>
<!--错误就在这里 end-->
<asp:HyperLink id=HyperLink1 runat="server" Width="520px" Text='<%# DataBinder.Eval(Container.dataItem,"companyName") %> '>
</asp:HyperLink>
</ItemTemplate>
</asp:datalist>
Codebehind Part:
Private Sub Page_Load()
Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Put user code to initialize the page here
Dim t As New DataTable
Dim cm As New SqlCommand
cm.CommandText = "select * from customers"
cm.CommandType = CommandType.Text
cm.Connection = SqlConnection1
Dim ad As New SqlDataAdapter
ad.SelectCommand = cm
ad.Fill(t)
DataList1.DataSource = t
DataList1.DataBind()
End Sub
Private Sub DataList1_ItemDataBound() Sub DataList1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataListItemEventArgs) Handles DataList1.ItemDataBound
Dim hl As HyperLink
'在这里会出错
hl = CType(e.Item.FindControl("HyperLink1"), HyperLink)
hl.Text += "ddd"
End Sub
'Put user code to initialize the page here
Dim t As New DataTable
Dim cm As New SqlCommand
cm.CommandText = "select * from customers"
cm.CommandType = CommandType.Text
cm.Connection = SqlConnection1
Dim ad As New SqlDataAdapter
ad.SelectCommand = cm
ad.Fill(t)
DataList1.DataSource = t
DataList1.DataBind()
End Sub
Private Sub DataList1_ItemDataBound() Sub DataList1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataListItemEventArgs) Handles DataList1.ItemDataBound
Dim hl As HyperLink
'在这里会出错
hl = CType(e.Item.FindControl("HyperLink1"), HyperLink)
hl.Text += "ddd"
End Sub
看了 Meyer的 回复:
我明白了,在执行时它是对所有的ItemType的进行查询,当我添加 HeaderTempate时候,它首先对ListItemType.Head 查询,这时当然用FindControl时找不到HyperLink1,于是下面自然会报没有实例化的错误了。改善的代码是。
要注意是在ItemTemplate中含有两种ListItemType,分别是AlternatingItem和Item
Private
Sub DataList1_ItemDataBound()
Sub DataList1_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataListItemEventArgs) Handles DataList1.ItemDataBound
Dim hl As HyperLink
If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
hl = CType(e.Item.FindControl("HyperLink1"), HyperLink)
hl.Text += "ddd"
End If
End Sub
Dim hl As HyperLink
If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
hl = CType(e.Item.FindControl("HyperLink1"), HyperLink)
hl.Text += "ddd"
End If
End Sub