2011-12-29 32 views
2

我創建了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("...")

但是,根據我的職位的理解refered到了後,我有什麼應該是工作。

回答

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 
+0

我不認爲你的第一個陳述是真實的,是不是默認啓用ViewState的自定義控件及其屬性?我認爲第二種解決方案是可行的,因爲無論何時通過綁定表達式(在formview綁定時間)設置屬性,都會設置UserControl的成員屬性,但我不確定這是否是常見的代碼模式。我感覺有點奇怪。 – pseudocoder 2011-12-29 15:09:40

+0

@pseudocoder - 此Web用戶控件,您必須顯式地將值設置爲ViewState才能定製屬性。在每個請求中,在OP代碼的Page_Load中檢查DateValue屬性。重要的一點是,Page_Load事件在DateValue賦值之前被調用,這就是我提出第二種方法的原因。 – adatapost 2011-12-29 16:15:52

+0

命名subPage「Page_Load()」是一個誤用,因爲它在技術上是一個正在加載的用戶控件。爲了清晰起見,我會改變這一點。該控制實際上並沒有對價值本身起作用。它是一個組合在一起的控件集合,以最大限度地減少捕獲日期所需的工作量(在此版本中)。 – 2011-12-29 18:38:58

1

的問題是,數據綁定不上你的FormView的發生,直到Page.Load後,你在被檢查的屬性值那時。如果您希望在Page.Load中設置值,則需要使用FormView.Databind()進行手動綁定。

或者,您可以更改自定義控件中列出的代碼,以處理Page.Load以處理Page.Prerender,如果不需要代碼先執行的話。

+0

謝謝。將代碼移動到_PreRender的訣竅。 – 2011-12-29 18:32:22

+0

@David C. Holley不客氣!如果您覺得它已回答您的問題,請記住接受我的答案。 – pseudocoder 2011-12-29 19:18:08

1

看起來問題可能是時間/事件相關。

當您使用<%# %>設置屬性時,該值將在控件的數據綁定事件期間分配給該屬性。如果你在Page_Load()找時間,它不會在那裏。

如果更改代碼以檢查PreRender事件中的值,它應該在那裏。

+0

我認爲這與我的回答基本相同,所以我同意! – pseudocoder 2011-12-29 15:56:17

相關問題