华域联盟 .Net 动态加载用户控件至DataList并为用户控件赋值实例演示

动态加载用户控件至DataList并为用户控件赋值实例演示

为了实现这个演示,Insus.NET使用通用的新闻例子,它类别(目录)以及文章。在一个页面,显示所有类别,每个目录下显示最新几条新闻。

效果如下:

目录是用DataList控件显示,而文章标题列表是一个用户控件显示,这个用户控件将动态被加入至DataList。

复制代码 代码如下:

View Code

<asp:Repeater ID="Repeater1" runat="server" OnItemDataBound="Repeater1_ItemDataBound">

<HeaderTemplate>

<table cellpadding="5" cellspacing="0" width="100%">

</HeaderTemplate>

<ItemTemplate>

<tr style="height: 30px; line-height: 10px;">

<td>

$

</td>

<td>

<asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl='<%# "~/ArticleView.aspx?ID=" & Eval("Article_nbr")%>' ToolTip='<%# Eval("Subject")%>' Target="_blank"></asp:HyperLink>

</td>

<td>

<%# objInsusDateTimeUtility.GetDateTime(Eval("PublicDate"), "yyyy-MM-dd")%>

</td>

</tr>

</ItemTemplate>

<FooterTemplate>

</table>

</FooterTemplate>

</asp:Repeater>

复制代码 代码如下:

View Code

View Code

Imports System.Data

Imports Insus.NET

Partial Class AscxControls_ArticleList

Inherits System.Web.UI.UserControl

Implements ISetValue '继承接口

Dim objArticle As New Article()

Protected objInsusDateTimeUtility As New InsusDateTimeUtility()

Private _DataSource As Object

Private _SubjectLength As Integer = 20

Public WriteOnly Property SubjectLength() As Integer

Set(ByVal value As Integer)

_SubjectLength = value

End Set

End Property

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs) Handles Me.Load

Data_Binding()

End Sub

'绑定数据至Repeater控件

Private Sub Data_Binding()

Me.Repeater1.DataSource = _DataSource

Me.Repeater1.DataBind()

End Sub

Protected Sub Repeater1_ItemDataBound(ByVal sender As Object, ByVal e As RepeaterItemEventArgs)

Dim objDrv As DataRowView = DirectCast(e.Item.DataItem, DataRowView)

If e.Item.ItemType = ListItemType.AlternatingItem OrElse e.Item.ItemType = ListItemType.Item Then

If e.Item.FindControl("HyperLink1") IsNot Nothing Then

Dim LinkSubject As HyperLink = DirectCast(e.Item.FindControl("HyperLink1"), HyperLink)

If objDrv("Subject").Length > _SubjectLength Then

LinkSubject.Text = objDrv("Subject").Substring(0, _SubjectLength) & "..."

Else

LinkSubject.Text = objDrv("Subject").ToString()

End If

End If

End If

End Sub

'实现接口

Public Sub SetValue(str As Object) Implements ISetValue.SetValue

Me._DataSource = str

End Sub

End Class

上面用户控件中,有一个接口:

复制代码 代码如下:

ISetValue

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

namespace Insus.NET

{

public interface ISetValue

{

void SetValue(object obj);

}

}

显示目录:

复制代码 代码如下:

View Code

<asp:DataList ID="DataListCatalog" runat="server" RepeatColumns="2" RepeatDirection="Horizontal" DataKeyField="Catalog_nbr" OnItemDataBound="DataListCatalog_ItemDataBound">

<ItemTemplate>

<div style="padding:2PX; height:25px; background-color:#cbfb25; font-weight:bold; line-height:25PX;">

<%# Eval("CatalogName")%>

</div>

<asp:PlaceHolder ID="PlaceHolderArticleList" runat="server"></asp:PlaceHolder>

</ItemTemplate>

</asp:DataList>

从数据库获取数据并绑定至目录的DataList控件。

复制代码 代码如下:

View Code

Imports Insus.NET

Partial Class Index

Inherits System.Web.UI.Page

Dim objCatalog As New Catalog()

Dim objArticle As New Article()

Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load

If Not IsPostBack Then

Data_Binding()

End If

End Sub

Private Sub Data_Binding()

objCatalog.IsActive = True

Me.DataListCatalog.DataSource = objCatalog.GetByIsActive()

Me.DataListCatalog.DataBind()

End Sub

End Class

下面是重点,就是OnItemDataBound事件,在这个事件中,需要找到asp:PlaceHolder控件,这个容器将用来加载用户控件。

复制代码 代码如下:

Protected Sub DataListCatalog_ItemDataBound(sender As Object, e As DataListItemEventArgs)

If e.Item.ItemType = ListItemType.Item OrElse e.Item.ItemType = ListItemType.AlternatingItem Then

'判断asp:PlaceHolder是否存在

If e.Item.FindControl("PlaceHolderArticleList") IsNot Nothing Then

Dim ctllaceHolder As PlaceHolder = DirectCast(e.Item.FindControl("PlaceHolderArticleList"), PlaceHolder)

'动态加载用户控件,并转换为接口。

Dim objuc As ISetValue = DirectCast(LoadControl("~/AscxControls/ArticleList.ascx"), ISetValue)

'找到DataList控件的目录主键

objArticle.Catalog_nbr = Me.DataListCatalog.DataKeys(e.Item.ItemIndex)

objArticle.Top = 2

'为用户控件赋值。

objuc.SetValue(objArticle.GetArticalTopByCatalog())

'加载用户控件。

ctllaceHolder.Controls.Add(objuc)

End If

End If

End Sub
您可能感兴趣的文章:

  • 获取DataList控件的主键和索引实用图解
  • 通过RadioButton对DataList控件进行单选实例说明
  • Datalist控件使用存储过程来分页实现代码
  • asp.net datalist 用法
  • DataList中TextBox onfocus调用后台void静态方法及获取相应行数

本文由 华域联盟 原创撰写:华域联盟 » 动态加载用户控件至DataList并为用户控件赋值实例演示

转载请保留出处和原文链接:https://www.cnhackhy.com/45939.htm

本文来自网络,不代表华域联盟立场,转载请注明出处。

作者: sterben

发表回复

联系我们

联系我们

2551209778

在线咨询: QQ交谈

邮箱: [email protected]

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部