2011-02-07 2 views
1

나는 동적 컨트롤을 SimpleQueryControl에 추가하려고합니다. 물론 이것은 웹 컨트롤의 일종이며 이에 따라 모든 메서드를 상속합니다. 나는 내가 동적으로 추가 한 하위 컨트롤의 값을 얻는 방법을 모른다.동적으로 추가 된 컨트롤의 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에서 만드는 모든 컨트롤을 넣어 추천 할 것입니다.

두 번째로,이 방법을 사용할 수있는 몇 가지 방법이 있습니다.

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

대안이 DateTimeControl 개인 멤버 변수를 확인하는 것입니다 : 첫 번째는 제어 (example here)에 대한 참조를 얻을 수의 FindControl을 사용하는 것입니다.

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

안녕하세요 Brian, 답장을 보내 주셔서 감사합니다. 어떻게 DateTimeControl 사용자가 선택한 값을 저장하지 않도록 할 수 있습니다. 포스트 백이 발생하면 선택한 날짜를 저장할 수 없습니다. –

+0

또한 최신 코드를 볼 수 있습니다. http://pastebin.com/Htk6RaT1 –

+0

제어 값은 viewstate 중에로드해야합니다. Init 또는 이전에 컨트롤이 생성되었는지 확인하십시오. 또는 IPostBackDataHandler를 구현하면 LoadPostData가 전체 게시 트리로 시작되므로 입력 된 날짜를 가져올 수 있습니다. –

관련 문제