2010-03-11 4 views
1

사용자 지정 웹 컨트롤이 있습니다. 이 컨트롤 안에 버튼을 추가하고 컨트롤이 포함 된 WebForm에있는 EventHandler에 액세스하려고합니다. 핸들러는 WebForm의 컨트롤을 처리하므로 거기에 있어야합니다. 아마 컨트롤에서 버튼을 제거 할 수는 있지만 조직을 위해 컨트롤에 유지하는 것이 좋습니다.웹 양식 클래스의 이벤트 처리기 제어

public class LanguageSelection : WebControl 
{ 
    private List<Language> _Languages; 

    private CSSImageButton btnOk = new CSSImageButton(); 
    private CSSImageButton btnClose = new CSSImageButton(); 

    public List<Language> Languages 
    { 
     set { _Languages = value; } 
     get { if (_Languages != null) return _Languages; else; _Languages = LanguageManager.Select(); return _Languages; } 
    } 

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

     Control parent; 
     Control container; 

     btnClose.CssClass = "sprReprove"; 
     btnClose.DivClass = "float-right"; 
     btnClose.OnClientClick = "$('#languagesOptions').hide('slow')"; 

     btnOk.CssClass = "sprApprove"; 
     btnOk.DivClass = "float-right"; 
     btnOk.Click += new ImageClickEventHandler("btnSave_Click"); // this method here is on the webform where i included the control 

     // Get a reference to the ScriptManager object for the page 
     // if one exists. 
     ScriptManager sm = ScriptManager.GetCurrent(Page); 

     if (sm == null || !sm.EnablePartialRendering) 
     { 
      // If partial rendering is not enabled, set the parent 
      // and container as a basic control. 
      container = new Control(); 
      parent = container; 
     } 
     else 
     { 
      // If partial rendering is enabled, set the parent as 
      // a new UpdatePanel object and the container to the 
      // content template of the UpdatePanel object. 
      UpdatePanel up = new UpdatePanel(); 
      container = up.ContentTemplateContainer; 
      parent = up; 
     } 

     container.Controls.Add(new LiteralControl("<div id=\"languagesOptions\" class=\"divSelectLanguages\">")); 
     container.Controls.Add(new LiteralControl(" <strong>Salvar conteúdo nestes idiomas?</strong>")); 
     container.Controls.Add(new LiteralControl("<table class=\"tblSelectLanguages\">")); 


     int i = 0; 
     foreach (Language l in Languages) 
     { 
      CheckBox cb = new CheckBox(); 
      cb.Enabled = false; 
      if(i % 2 == 0) container.Controls.Add(new LiteralControl("</tr><tr>")); 
      container.Controls.Add(new LiteralControl("<td>")); 
      container.Controls.Add(cb); 
      container.Controls.Add(new LiteralControl(l.FullName)); 
      container.Controls.Add(new LiteralControl("</td>")); 
      i++; 


     } 
     container.Controls.Add(new LiteralControl("</tr>")); 
     container.Controls.Add(new LiteralControl("</table>")); 


     container.Controls.Add(btnOk); 
     container.Controls.Add(btnClose); 

     container.Controls.Add(new LiteralControl("</div>")); 

     Controls.Add(parent); 

    }} 

답변

1

버튼이 포함 된 웹 양식의 이벤트로 처리되는 것이 바람직하지 않습니다. 이상적으로는 컨트롤이 완전히 자체 포함되어야합니다. 대신, 컨트롤 내에서 버튼 클릭 이벤트를 처리 한 다음 WebForm에서 처리 할 수있는 다른 이벤트를 발생시킬 수 있습니다.

버튼이 webcontrol 내부를 클릭
<app:LanguageSelection ID="LanguageSelection1" OnOkButtonClicked="btnSave_Click" runat="server"/> 

, 그것이 webcontrol 내부의 btnOk_Click 방법에 의해 처리 될 것입니다 : 당신의 웹 양식에

// This event will be handled by the webform 
public event EventHandler OkButtonClicked; 

protected void btnOk_Click(object sender, EventArgs e) 
{ 
    // Raise the okButtonClicked event 
    if (OkButtonClicked != null) 
     OkButtonClicked(sender, e); 
} 

// The btnOk button will be wired to our new event handler 
btnOk.Click += new ImageClickEventHandler(btnOk_Click); 

, 당신은 이런 식으로 뭔가를 할 수 있습니다. 그러면 컨트롤이 포함 된 WebForm에서 btnSave_Click 메서드에 의해 처리 될 OkButtonClicked 이벤트가 발생합니다.

+0

니스! 고맙습니다. 나는 그것을 내일 시험해보고 그것이 어떻게 나를 위해 일했는지에 대한 피드백을주기 위해 되돌아 올 것이다. –

+0

그쪽으로 일했습니다! 고맙습니다 –