2010-05-13 4 views
0

button_click 이벤트에 대해 매번 UserControl 인스턴스를 추가하려고하는데, 처음에만 작동합니다.
ViewState에서 정수를 추가하여 사용자 정의 컨트롤에 ID를 추가하고 있습니다.
왜 후속 클릭에 대한 작업이 추가되지 않습니다.
다음은 동일한 동작을 사용하는 단순화 된 버전입니다.ButtonClick 이벤트에 매번 usercontrol 추가

protected void Button1_Click(object sender, EventArgs e) 
{ 
    HtmlButton btnClick = new HtmlButton(); 
    btnClick.ID = "bt" + Append.ToString(); 
    btnClick.InnerText = "Button 1"; 
    MainArea.Controls.Add(btnClick); 
}   
+0

당신이 코드없이 – BritishDeveloper

+0

당신의 버튼 클릭 코드를하시기 바랍니다 추가 할 수 있습니다 내가 확실히 말할 수는 없지만 : 여기 내 addAddressControl 방법입니다 Control.ID = "blahblah"+ countFromViewState와 같이 클릭만으로 컨트롤을 추가 할 가능성이 매우 높습니다. 실제로 필요한 것은 카운터 틱 당 하나의 컨트롤을 추가하는 for 루프입니다. 그렇지 않으면 페이지가 다시 올 때마다 (버튼 클릭시) 추가 된 컨트롤이 지워집니다. – CodexArcanum

답변

0

이제 코드가 게시되었으므로 문제를 확인할 수 있습니다.

버튼을 클릭 할 때마다 다시 게시가 이루어집니다. 다시 게시 할 때 이름이 포함 된 새 단추를 추가합니다. 그러나 페이지가 두 번째 버튼 클릭으로 다시 렌더링되면 추가 한 모든 컨트롤이 손실되고이 포스트 백의 버튼 클릭에서 해당 컨트롤을 다시 추가합니다.

그래서 당신은 루프를 설정하고 싶은 것, 무엇인가 :

protected void Button1_Click(object sender, EventArgs e) { 
    for(int i = 0; i < Append; i++) 
    { 
     HtmlButton btnClick = new HtmlButton(); 
     btnClick.ID = "bt" + i.ToString(); 
     btnClick.InnerText = "Button " + i; 
     MainArea.Controls.Add(btnClick); 
    } 
} 

그리고 그 "추가"가정, 이전의 클릭 당 하나 개의 버튼을 추가합니다 당신이있어 카운터의 일종 viewstate에 저장.

클릭당 하나의 컨트롤 인스턴스가 필요하다고 가정했습니다. 네가 말한 것 같아.

+0

답장을 보내 주셔서 감사합니다! 너희들에게 또 다른 질문이있어. 컨트롤의 ID가 동일하게 유지 되더라도 내 viewstate는 포스트 백 동안 유지되지 않습니다. @CodexArcanum 언급처럼 버튼 클릭에 사용자 컨트롤을 추가하고 있습니다. 5 번 클릭하면 5 번 반복하고 5 명의 사용자 컨트롤을 추가한다는 것을 의미합니다. 이전의 ID는 동일하지만 동일하게 유지됩니다. viewstate에서 사용자 입력을 지속하려면 어떻게해야합니까? –

0

주소 사용자 컨트롤과 비슷한 작업을하고 있습니다.

컨트롤을 동적으로 추가하기 때문에 각 포스트 백 이후에 컨트롤을 다시 만들어야합니다 (다른 컨트롤을 추가 할 때마다 이전에 추가 한 모든 컨트롤을 다시 만들어야합니다).

컨트롤 ID의 arraylist를 유지합니다 (뷰 스테이트에서 내용을 유지하려면 동일한 ID로 컨트롤을 만들어야 함). 이전에 추가하고 다시 작성해야하는 컨트롤의 수를 추적합니다 . 나는 통해 다음 루프와 페이지로드 이벤트에 다시 컨트롤을 만들 : (내 경우에는 내가 링크 버튼을 사용하고

foreach (string id in AddressItemIDs) 
{ 
    addAddressControl(null, id); 
} 

다음 내 "를 Button1_Click"이벤트 ...

protected void LinkButton1_Click(object sender, EventArgs e) 
    { 
     if (AddressCount == 0 || AddressCount < MaxAddresses && ((addressItem)addressContainer.Controls[addressContainer.Controls.Count-1]).HasAddress) 
     { 
      int i = 0; 
      string prefix = "addressItem_"; 
      while (AddressItemIDs.Contains(prefix + i)) i++; 

      AddressCount++; 
      addAddressControl(null, prefix + i); 

     } 
     Button1.Visible = (AddressCount < MaxAddresses); 
    } 

그것을

protected void addAddressControl(Address address, string id) 
    { 
     addressItem ai = (addressItem)LoadControl("~/controls/addressItem.ascx"); 
     ai.RemoveClicked += new EventHandler(ai_RemoveClicked); 
     ai.ID = id; 

     if (address != null) 
     { 
      ai.AddressID = address.AddressID; 
      ai.Address = address.Street; 
      ai.City = address.City; 
      ai.State = address.State; 
      ai.Zip = address.Zip; 
      ai.TypeID = address.TypeID; 
     } 
     if(!AddressItemIDs.Contains(id)) 
      AddressItemIDs.Add(id); 

     addressContainer.Controls.Add(ai); 
    } 
+0

실제로 이러한 컨트롤을 사용하여 수행되는 작업에 따라 영구 저장소를 살펴 보는 것이 좋습니다. 주로 SQL DB를 의미하지만 대안도 있습니다. 그런 다음 Repeater 컨트롤을 사용하여 컨텐트를 생성하고 DB를 사용하여 뷰와 세션간에 상태를 저장할 수 있습니다. – CodexArcanum

+0

일단 데이터가 저장되면 SQL DB를 사용하여 데이터를 저장하고 있지만이 컨트롤과 Ajax를 사용하여 그 동안 x 개의 항목을 추가/편집하고 있습니다. – earthling

+0

답장을 보내 주셔서 감사합니다! 너희들에게 또 다른 질문이있어. 컨트롤의 ID가 동일하게 유지 되더라도 내 viewstate는 포스트 백 동안 유지되지 않습니다. @CodexArcanum 언급처럼 버튼 클릭에 사용자 컨트롤을 추가하고 있습니다. 5 번 클릭하면 5 번 반복하고 5 명의 사용자 컨트롤을 추가한다는 것을 의미합니다. 이전의 ID는 동일하지만 동일하게 유지됩니다. viewstate에서 사용자 입력을 지속하려면 어떻게해야합니까? –

0
public partial class _Default : Page 
{ 
    public int n; 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (ViewState["Controls"] != null) 
      n = (int)ViewState["Controls"]; 
     if (!Page.IsPostBack) 
      n = 0; 
     for (int i = 0; i <= n; i++) 
     { 
      TestUserControl uc = LoadControl("~/TestUserControl.ascx") as TestUserControl; 
      uc.ID = "TestControl" + i.ToString(); 
      PlaceHolder1.Controls.Add(uc); 
     } 

    } 

    protected void Button1_Click(object sender, EventArgs e) 
    { 
     TestUserControl uc = LoadControl("~/TestUserControl.ascx") as TestUserControl; 
     uc.ID = "TestControl" + n++.ToString(); 
     PlaceHolder1.Controls.Add(uc); 
     ViewState["Controls"] = n; 
    } 
} 
관련 문제