2009-07-29 3 views
0

런타임 중에 일부 확인란을 동적으로 추가하고 다음에 다시로드 할 때 확인란을 선택했는지 여부를 알아야합니다. ViewState에 저장된 목록에서 확인란 값을로드합니다. 질문은 다음과 같습니다. Checked? 체크 상자에 이벤트 처분을 시도했지만 체크 박스를 추가 할 자리 표시자를 시도했지만 해고되지 않았습니다. 즉 중단 점을 넣을 때 멈추지 않았습니다. 그래서 어떤 제안이라도? 동적 체크 박스의 "Checked"속성 값을 저장하는 방법

은 샘플 코드입니다,하지만 난 그게 필요하다고 생각하지 않습니다

void LoadKeywords() 
    { 
     bool add = true; 
     foreach (string s in (ViewState["keywords"] as List<string>)) 
      if (s == ddlKeywords.SelectedItem.Text) 
      { 
       add = false; 
       continue; 
      } 

     if (add) 
      (ViewState["keywords"] as List<string>).Add(ddlKeywords.SelectedItem.Text); 



     foreach (string s in (ViewState["keywords"] as List<string>)) 
     { 
      CheckBox kw = new CheckBox(); 
      kw.Disposed += new EventHandler(kw_Disposed); 
      kw.Text = s; 
      PlaceHolderKeywords.Controls.Add(kw); 
     } 
    } 

답변

2

런타임에 컨트롤을 동적으로 추가하는 경우 ViewState가로드되기 전에 해당 컨트롤이 페이지의 컨트롤 컬렉션에 채워져 있는지 확인해야합니다. 이것은 각 체크 박스의 상태가 Viewstate에서 재수화될 수 있도록하기위한 것입니다. 예를 들어 페이지로드 이벤트가 너무 늦었습니다.

일반적으로 초기화 상태 (보기 상태가로드되기 전에) 중에 CheckBox 컨트롤을 동적으로 추가 한 다음보기 이벤트가로드 된 후로드 이벤트 중에 체크 상자 컨트롤의 값을 읽습니다.

예 : **** 편집 **** 이 그냥 데모 코드가 분명히 있음을 언급하는 것을 잊었다

을하는 데 도움이

protected override void OnInit(EventArgs e) 
{ 
    //load the controls before ViewState is loaded 
    base.OnInit(e); 
    for (int i = 0; i < 3; i++) 
    { 
     CheckBox cb = new CheckBox(); 
     cb = new CheckBox(); 
     cb.ID = "KeyWord" + i.ToString(); 
     cb.Text = "Key Word" 
     MyPlaceHolder.Controls.Add(new CheckBox()); 
    } 
} 

//this could also be a button click event perhaps? 
protected override void OnLoad(EventArgs e) 
{ 
    base.OnLoad(e); 
    if (Page.IsPostBack) 
    { 
     //read the checkbox values 
     foreach(CheckBox control in MyPlaceHolder.Controls) 
     { 
      bool isChecked = control.Checked; 
      string keyword = control.Text; 

      //do something with these two values 
     } 
    } 
} 

희망 - 당신이 그것을 구체화해야합니다.

ASP.Net의 다이나믹 컨트롤 렌더링에 대한 자세한 내용은 this article on 4Guys을 확인하십시오.

ASP.Net의 페이지 수명주기에 대한 자세한 내용은 MSDN을 확인하십시오.

+0

감사합니다. 나는 당신의 아이디어를 이해하기 시작했으나, 무엇이 채워 졌는가? –

+0

Ahmed,이 코드는 예제처럼 Checkbox 컨트롤을 PlaceHolder 컨트롤로 채 웁니다. 이것은 Page (또는 Control) Init 메소드 중에 발생합니다. 나는 단지 3 가지를 만들었지 만 원하는만큼 많은 체크 박스를 만들 수 있습니다. Viewstate를 사용하지 않으면 PostBack에서 CheckBox.Checked 속성을 유지할 수 없기 때문에 페이지 초기화에서이 작업을 수행해야합니다. 그런 다음 페이지로드 (Viewstate가로드 된 후)에 다시 게시 할 때 사용자가 양식을 제출하면 확인란의 상태를 읽을 수 있습니다 (버튼이있을 수 있습니다). –

+0

코드 예제를 조금 더 명확하게 업데이트했습니다. 조금 더 이해가 가지기를 바랍니다. –

0

방법 :

시도 (확인 처리하는 자바 스크립트 코드), 를 추가하는 u를 얻을 수 있습니다 document.findElementById (ID)를 사용하여 확인란을 선택한 다음 확인란의 값을 runat = "server"속성이있는 hiddenfield에 저장합니다.

페이로드로드시 : 페이지가 포스트 백()인지 확인하고 숨겨진 필드 값 (S)을 확인하십시오. 제출 단추를 추가하십시오 (이벤트를 코드 뒤에 넣으십시오. runat = "server"특성).

희망이 도움이 되셨습니다.

+0

솔직히 말해서 좋은 선택은 아닙니다. ASP.Net은 수동 조작이 필요없는 모든 작업을 처리합니다 * if * 페이지 수명주기를 존중하면 –

관련 문제