2011-12-29 12 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はそれで価値を持っていることを確認しました。理由が何であれ、値はコントロールに渡されませんが、コントロールはリテラル値を認識します。私はこのURL ASP.NET User Control : can't initialize a user control property using Eval("...")

でポストに参照された

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 

しかし、ポストの私の理解に基づいて、私が持っていることは働くべきです。

答えて

1

ページリクエスト間にDateValueを保持するには、ViewStateを使用する必要があります。直接コントロールへ

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

最初のステートメントがtrueであるとは思いませんが、カスタムコントロールとそのプロパティのデフォルトではViewStateは有効になっていませんか?私はUserControlのメンバーのプロパティは、(フォームビューのバインディング時に)バインディング式を介してプロパティが設定されるたびに設定されるので、私は思うが、私は思うが、これが共通のコードパターンであるかどうかはわかりません。それは私にはちょっと変わった感じがします。 – pseudocoder

+0

@擬似コード - このWebユーザーコントロールでは、カスタムプロパティの値をViewStateに明示的に設定する必要があります。要求ごとに、DateValueプロパティはOPコードのPage_Loadで検査されます。重要なのは、Page_LoadイベントがDateValue割り当ての前に呼び出されていることです。これが私が2番目のメソッドを提案した理由です。 – adatapost

+0

「Page_Load()」というサブクラスの命名は、技術的には読み込まれているユーザーコントロールであるため、誤解を招きます。私はそれを分かりやすくするために変更する予定です。コントロールは実際には値そのものに作用しません。これは、(このバージョンでは)日付を取得するために必要な労力を最小限に抑えるために組み合わせたコントロールの集合です。 –

1

問題は、データバインディングがPage.Load後まで、あなたのFormViewコントロールでは発生しません、とあなたが中にプロパティの値をチェックしているということですその時。 Page.Loadに値を設定する場合は、FormView.Databind()を使用して手動でバインドする必要があります。

また、カスタムコントロールにリストされているコードを、Page.Prerenderを処理するためにPage.Loadを処理するように変更することもできます。

+0

ありがとうございます。コードを_PreRenderに移動させることはやりました。 –

+0

@David C. Holleyよろしくお願いします!あなたの質問に答えたと思ったら私の答えを受け入れることを覚えておいてください。 – pseudocoder

1

問題がタイミング/イベントに関連しているようです。

<%# %>でプロパティを設定すると、その値がコントロールのデータバインディングイベント中にプロパティに割り当てられます。もしあなたがPage_Load()時にそれを探すなら、まだそこにはいません。

PreRenderイベントの値をチェックするようにコードを変更した場合は、それが存在するはずです。

+0

これは私の答えと実質的に同じだと思いますので、私は同意します! – pseudocoder

関連する問題