ASP.NET 设计时数据绑定自定义控件

分享于 

6分钟阅读

Web开发

  繁體 雙語

介绍

本文介绍如何在控件中使用数据绑定复合模板时为自定义web控件提供设计时数据绑定功能。 例如如果你将自定义web控件添加到 asp:RepeaterItemTemplate

背景

自定义web控件内部使用自定义网页控件时,设计时不使用自定义网页设计器,即使调用 Databind 事件也未设置数据绑定属性。 为了在设计时正确地设置自定义站点控件的数据绑定属性以正确显示控件,必须使用 DataBindingHandler

使用代码

下面是通用 DataBinderHandler的示例代码。 这里处理程序应正确显示任何 绑定("propertname" , Eval ("propertyname" ,或者 DataBinder.Eval(Container,"PropertyName" ) 设计时的表达式。

为了告诉设计器使用 DataBinderHandler,必须将 DataBindingHandler 属性添加到自定义web控件。

<Designer(GetType(InvoiceControlDesigner)), _
DataBindingHandler(GetType(DEDataBindingHandler)), _
ToolboxData("<{0}:InvoiceControl runat="server"></{0}:InvoiceControl>")> _PublicClass InvoiceControl
 Inherits System.Web.UI.WebControls.CompositeControl
.....EndClassPublicOverridesSub DataBindControl(ByVal designerHost As _
 System.ComponentModel.Design.IDesignerHost, _ 
 ByVal control As System.Web.UI.Control)
 Dim myIDataBindingAccesor As IDataBindingsAccessor = control
 If myIDataBindingAccesor.HasDataBindings ThenForEach mydatabinding As DataBinding In _
 myIDataBindingAccesor.DataBindings
 Dim pinfo As System.Reflection.PropertyInfo
 pinfo = control.GetType.GetProperty(mydatabinding.PropertyName, _
 mydatabinding.PropertyType, System.Type.EmptyTypes)
 If pinfo IsNotNothingThenDim MyValue AsObject = NothingSelectCase mydatabinding.PropertyType.FullName
 Case"System.String" MyValue = "ABC"Case"System.Date" MyValue = #1/1/1970#
 Case"System.Integer", "System.Long" MyValue = 123Case"System.Single", "System.Double" MyValue = 12.34CaseElse MyValue = "DataBound"EndSelectTryIf control.BindingContainer IsNotNothingAndAlso _ 
 TypeOf control.BindingContainer Is IDataItemContainer ThenIf mydatabinding.Expression.ToLower.StartsWith("bind(""") Or _
 mydatabinding.Expression.ToLower.StartsWith("eval(""") Or _
 mydatabinding.Expression.ToLower.StartsWith("databinder.eval(container") ThenDim StartPosition AsInteger = mydatabinding.Expression.IndexOf("(")
 Dim FormatPosition AsIntegerDim ExPrefix AsString = ""IfNot mydatabinding.Expression.ToLower.StartsWith(_
 "databinder.eval(container") Then ExPrefix = "DataItem."Else StartPosition = mydatabinding.Expression.IndexOf(",", StartPosition) + 2EndIf FormatPosition = mydatabinding.Expression.IndexOf(",", StartPosition)
 Dim mydatabindingex AsString = ""If FormatPosition> 4Then mydatabindingex = mydatabinding.Expression.Substring(StartPosition, _
 FormatPosition - StartPosition + 1)
 Dim FormatString AsString FormatString = mydatabinding.Expression.Substring(FormatPosition + 2, _
 mydatabinding.Expression.Length - FormatPosition - 4)
 MyValue = DataBinder.Eval(control.BindingContainer, _
 ExPrefix & mydatabindingex, FormatString)
 Else mydatabindingex = mydatabinding.Expression.Substring(StartPosition, _
 mydatabinding.Expression.Length - StartPosition - 2)
 MyValue = DataBinder.Eval(control.BindingContainer, _
 ExPrefix & mydatabindingex)
 EndIfEndIfEndIfCatch ex As Exception
 Debug.WriteLine("DataBinderHandler Failed" & ex.ToString)
 EndTryIf System.Type.Equals(MyValue.GetType, mydatabinding.PropertyType) Then pinfo.SetValue(control, MyValue, Nothing)
 EndIfEndIfNextEndIfEndSubEndClass

ASP.NET 代码:

<asp:RepeaterID="Repeater1"runat="server"DataMember="InvoiceList"DataSourceID="DEDataSource1"><ItemTemplate><asp:LabelID="Label1"runat="server"Text='<%# Bind("InvoiceID") %>'></asp:Label><DE:InvoiceControlID="InvoiceControl1"runat="server"Invoice='<%# Databinder.Eval(Container,"DataItem") %>'LogoImagePath="http://www.digitalexample.com/images/delogo.gif"InvoiceControlMode="ReadOnly"InvoiceControlStyle="Default"><InvoiceTableStyleCellPadding="3"CellSpacing="0"Height="100%"Width="100%"/></DE:InvoiceControl>

Points of interest

在我能够找出自定义控件在一个 Repeater 内部进行的原因之前,它花了大量的挖掘。 调试显示数据绑定属性没有被设置,但是数据绑定事件被调用。 我还注意到设计时,设计器没有调用 PreRender 事件。 我不确定为什么微软没有包含一个通用的DataBindingHandler,当没有 DataBindingHandler 属性集时使用。

历史记录

  • /21/2007 DeVries最初发布在 08上。

数据  控制  asp-net  DES  设计  Controls  
相关文章