2010-03-11 95 views
1

我有一个自定义WebControl。在这个控件的内部,我添加一个按钮,并且我想让它访问包含该控件的WebForm中的EventHandler。处理程序使用WebForm中的控件进行处理,因此它必须在那里。我可以设法让按钮脱离控制,但为了组织的目的,最好将它保持在控制之下。在Web窗体类中控制访问事件处理程序

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处理。

// 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); 

在您的网页表单,你可以有这样的事情:

<app:LanguageSelection ID="LanguageSelection1" OnOkButtonClicked="btnSave_Click" runat="server"/> 

当点击三夏里面的按钮,它会在三夏内btnOk_Click方法来处理。这会引发OkButtonClicked事件,该事件将由包含该控件的WebForm中的btnSave_Click方法处理。

+0

不错!谢谢。我明天会试试,然后回来给你一个关于如何为我工作的反馈。 – 2010-03-12 00:25:15

+0

Tha工作!谢谢 – 2010-03-12 18:53:54

相关问题