在用户控件上难倒自定义属性

时间:2011-12-29 13:54:33

标签: asp.net controls

我创建了一个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("...")

的帖子

但是,根据我对这篇文章的理解,我应该做些什么。

3 个答案:

答案 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事件中的值,则应该在那里。