我创建了一个ASP.NET用户控件。当我明确提供自定义属性的值时,该值将传递给控件。但是,当我尝试使用数据源中的值时,该值不会传递给控件。
用户控件位于FormView中。 FormView成功显示基础记录。我试图从FormView的数据源传递一个列中的值。这工作
<asp:formview .... />
<editTemplate>
<uctrl:DateSelector ID="DateSelector1" runat="server" DateValue="5/30/2011" /><br />
<%#Eval("MilestoneDate")%>
</editTemplate>
</asp:formview>
这不......
<asp:formview .... />
<editTemplate>
<uctrl:DateSelector ID="DateSelector1" runat="server" DateValue='<%#Eval("MilestoneDate")%>' /><br />
<%#Eval("MilestoneDate")%>
</editTemplate>
</asp:formview>
我已经确认MileStoneDate确实有一个值。无论出于何种原因,该值都不会传递给控件,但控件确实会识别文字值。
Imports Microsoft.VisualBasic
Imports System.Data
Imports System.Data.SqlClient
Imports System.Web.UI
Imports System.ComponentModel
Partial Class content_WebUserControl
Inherits System.Web.UI.UserControl
<Bindable(True, BindingDirection.OneWay)>
Public Property DateValue() As String
Get
Return _DateValue
End Get
Set(ByVal value As String)
_DateValue = value
End Set
End Property
Private _DateValue As String
Protected Sub Page_Load() Handles Me.Load
If IsDate(Me.DateValue) Then
Dim NewDate As DateTime = CDate(Me.DateValue)
LabelSelectedDateDisplay.Text = Me.DateValue
LabelSelectedDateDisplay_DayOfWeek.Text = NewDate.ToString("dddd")
TextBoxSelectedDate.Text = Me.DateValue
Else
LabelSelectedDateDisplay.Text = ""
LabelSelectedDateDisplay_DayOfWeek.Text = ""
TextBoxSelectedDate.Text = ""
End If
End Sub
End Class
我被称为此网址ASP.NET User Control : can't initialize a user control property using Eval("...")
的帖子但是,根据我对这篇文章的理解,我应该做些什么。
答案 0 :(得分:1)
您需要使用ViewState在页面请求之间保留DateValue。
Public Property DateValue() As String
Get
IF IsNothing(ViewState("datevalue") Then
return String.Empty
End If
return ViewState("datevalue").ToString()
End Get
Set(ByVal value As String)
ViewState("datevalue")=value
End Set
End Property
或直接将值存储到控件:
Public Property DateValue() As String
Get
Return LabelSelectedDateDisplay.Text
End Get
Set(ByVal value As String)
If IsDate(value) Then
Dim NewDate As DateTime = CDate(value)
LabelSelectedDateDisplay.Text = NewDate
LabelSelectedDateDisplay_DayOfWeek.Text = NewDate.ToString("dddd")
TextBoxSelectedDate.Text = NewDate
Else
LabelSelectedDateDisplay.Text = ""
LabelSelectedDateDisplay_DayOfWeek.Text = ""
TextBoxSelectedDate.Text = ""
End If
End Set
End Property
答案 1 :(得分:1)
问题是,在Page.Load之后,您的formview上不会发生数据绑定,并且您在此期间检查属性的值。如果您希望在Page.Load中设置该值,则需要使用FormView.Databind()
手动绑定。
或者,您可以更改自定义控件中列出的代码,从处理Page.Load到处理Page.Prerender,如果没有任何代码需要先执行代码。
答案 2 :(得分:1)
看起来这个问题可能与时间/事件有关。
使用<%# %>
设置属性时,会在Control的数据绑定事件期间将值分配给属性。如果您在Page_Load()
时间查找它,它就不会存在。
如果您更改代码以检查PreRender
事件中的值,则应该在那里。