2011-02-07 12 views
1

私は、いくつかのダイナミックコントロールをSimpleQueryControlに追加しようとしています(Webコントロールの一種であり、それに応じてすべてのメソッドを継承します)。私は動的に追加した子コントロールの値を取得する方法を知らない。動的に追加されたコントロールのID(およびもちろん値)を取得できません

class RoomPickerQueryControl : SimpleQueryControl 
{ 
    protected override void OnLoad(EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 
      EnsureChildControls(); 
      mColumnList.Visible = false; 


     } 



    } 

    protected override void OnInit(EventArgs e) 
    { 
     DateTimeControl controlStartDate = new DateTimeControl(); 
     controlStartDate.LocaleId = 1053; 
     controlStartDate.CssClassTextBox = "ms-long"; 
     controlStartDate.TimeZoneID = 1053; 
     controlStartDate.LocaleId = 1053; 
     controlStartDate.MinDate = DateTime.Now; 
     controlStartDate.ID = "startDateTime"; 
     controlStartDate.Visible = true; 
     controlStartDate.Enabled = true; 
     controlStartDate.EnableViewState = true; 
     this.Controls.Add(controlStartDate); 




     base.OnInit(e); 
    } 

    protected override void CreateChildControls() 
    { 

     base.CreateChildControls(); 


    } 

    protected override int IssueQuery(string search, string groupName, int pageIndex, int pageSize) 
    { 

     //i'm unable to get the ids here 
     DateTimeControl dt = (DateTimeControl) FindControlRecursive(this, "startDateTime"); 
//i'm unable to get the ids here 
     DateTimeControl dt3 = (DateTimeControl)FindControlRecursive(this.Page, "startDateTime"); 
//i'm unable to get the ids here 
     DateTimeControl controlStartDate = (DateTimeControl)this.FindControl("startDateTime"); 
//i'm unable to get the ids here 
     DateTimeControl controlEndDate = (DateTimeControl)this.FindControl("endDateTime"); 



     return rowCount; 
    } 


    public static Control FindControlRecursive(Control Root, string Id) 
    { 
     if (Root.ID == Id) 
      return Root; 
     foreach (Control Ctl in Root.Controls) 
     { 
      Control FoundCtl = FindControlRecursive(Ctl, Id); 
      if (FoundCtl != null) 
       return FoundCtl; 
     } 
     return null; 
    } 

    protected override void OnPreRender(EventArgs e) 
    { 
     base.OnPreRender(e); 


    } 
} 
+0

どのようにこの値を使用しますか? – EvgK

+0

IssueQueryメソッドでDateTimeControlの値を使用します。 –

+0

あなたの解決策を提供してください。あなたはそれらのIDとそのコントロールを解決しようとしています – Luke

答えて

0

まず、私はあなたがCreateChildControlsに作成されているすべてのコントロールを置くことをお勧めします。

第2に、これを実現する方法がいくつかあります。最初は、あなたのコントロールへの参照(example here)を取得するためにFindControlを使用することです:

DateTimeControl dt = this.FindControl("startDateTime") as DateTimeControl; 

代替をごDateTimeControlプライベートメンバ変数を作ることです。

class RoomPickerQueryControl : SimpleQueryControl 
{ 
    DateTimeControl controlStartDate; 
    DateTimeControl controlEndDate; 
    // more code... 

CreateChildControlsの中にあなたのプライベートメンバ変数を初期化します。

protected override void CreateChildControls() 
{ 
    base.CreateChildControls(); 

    // using our private class variable 
    controlStartDate = new DateTimeControl(); 
    controlStartDate.LocaleId = 1053; 
    // more code... 
} 

その後、あなたは、単にあなたのIssueQuery機能でcontrolStartDateを参照することができます。

+0

お返事ありがとうございます。私はポストに選択した日付を失っている。コントロールのポストバック時に選択した値を保持する方法は? –

+0

'IssueQuery'をあまりに早く呼び出すので、たぶんそうです。イベント(ボタンのクリックイベントなど)で、またはOnPreRenderで 'IssueQuery'を呼び出すことができます。ページのライフサイクルに関する詳細は次のとおりです。http://nishantrana.wordpress.com/2009/02/14/understanding-web-part-life-cycle/ –

+0

IssueQueryはコントロールによって自動的に呼び出され、デバッグ中には最後に呼び出されるメソッドです。私は何かを欠いているに違いない。ここにあなたの提案ごとに最新のコードへのリンクです:http://pastebin.com/Htk6RaT1 –

0

ストアそれらの変数参照:

private DateTimeControl _controlStartDate; 

Oninit(..) 
{ 
    _controlStartDate = new DateTimeControl(); 
} 
+0

こんにちはブライアンと返信いただきありがとうございます。ユーザーが選択した値を保存するためにDateTimeControlを回避するにはどうすればよいですか。ポストバックが発生したときに、選択した日付を保存できません。 –

+0

また、私の最新のコードを見てみることができます:http://pastebin.com/Htk6RaT1 –

+0

コントロールの値はviewstateの間にロードする必要があります。あなたのコントロールがInitまたはそれ以前に作成されていることを確認してください。また、IPostBackDataHandlerを実装している場合、LoadPostDataはポストツリー全体を起動し、そこに入力された日付を取得できます。 –

関連する問題