【问题标题】:How to add event to custom control that fired when click a button in it?如何将事件添加到单击其中的按钮时触发的自定义控件?
【发布时间】:2012-10-02 04:51:33
【问题描述】:

我想构建由显示表格的 html 代码组成的自定义控件,并且在该表格的页脚中我需要添加三个按钮。 我所做的是从 WebControl 类继承:

public class MyCustomControl : WebControl {  
    protected override void RenderContents(HtmlTextWriter output)
    {  
    // using output.Write I write the table in html code  
    // and I write the three buttons using <input> tag in html not <asp:button> tag
    }  
}

我想在这里为我编写的每个按钮添加三个事件,这些事件将在用户界面中使用并在单击正确按钮时触发:

<asp:MyCustomControl runat="server" id="myCtrl" onButton1Click="Button1_Click" onButton2Click="Button2_Click" />  

我该怎么做?

感谢

**UPDATE1:
我的自定义控件中的渲染代码是这样的:

protected override void RenderContents(HtmlTextWriter output)
    {
    output.Write("<table> ......");
    output.Write("<input id='button1' type='button'>");
    output.Write("<input id='button2' type='button'>");
    output.Write("<input id='button3' type='button'>");
    output.Write(".........</table>");
    }

那么我如何让“button1”在服务器端触发事件?

**UPDATE2:
这就是代码的样子:

public class MyCustomControl : WebControl
{

 public Button Button1 = new Button {Text = "Button1"};
 public Button Button2 = new Button {Text = "Button2"};

 public event EventHandler Button1_Click;
 public event EventHandler Button2_Click;

 protected override void OnPreRender(EventArgs e)
 {
   Button1.Click += Button1Click;
   Button2.Click += Button2Click;
   base.OnPreRender(e);
 }

 protected override void RenderContents(HtmlTextWriter output)
 {
  using (var plh = new PlaceHolder())
   {
   var htmlCode = new StringBuilder();
   htmlCode.Append("....html code for table...");

   var container = new HtmlGenericControl { InnerHtml = htmlCode.ToString() };

   plh.Controls.Add(container);
   plh.Controls.Add(Button1);
   plh.Controls.Add(Button2);
   plh.RenderControl(output);

   htmlCode.Append("..../html code for table...");
   }
 }

 private void Button1Click(object sender, EventArgs e)
 {
  if (Button1_Click != null)
      Button1_Click(this, e);
 }

 private void Button2Click(object sender, EventArgs e)
 {
  if (Button2_Click != null)
      Button2_Click(this, e);
 }

在page.aspx中:

<cc1:MyCustomControl ID="myCtrl" runat="server" onbutton1_click="MyCustomControl_Button1_Click" />

但即使这样,button1 的点击方法 'MyCustomControl_Button1_Click' 也没有被调用。

【问题讨论】:

    标签: asp.net custom-controls


    【解决方案1】:

    像这样声明你的新事件:

    public event EventHandler OnButton1Click;
    public event EventHandler OnButton2Click;
    public event EventHandler OnButton3Click;
    

    这个在每个按钮的点击方法中做这样的事情:

    public void Button1_Click(object sender, EventArgs e)
    {
        if (OnButton1Click != null)
            OnButton1Click(this, null);
    }
    

    【讨论】:

    • 但是 html 输入按钮如何像任何常规 asp.net 按钮一样触发服务器端单击方法?就像我说我正在手动编写按钮 html 代码一样,我没有在我的自定义控件中使用 ASP.NET 按钮(因为我不知道如何使用三个按钮和 html 表格来完成它)。
    • 使用 asp:Buttons 代替“常规”按钮
    • 如何?..我正在使用作为“RenderContents”覆盖方法的参数传递的“HtmlTextWriter”变量编写控件的输出结果..那么如何添加三个 asp.net 按钮?
    • @Dabbas,看到这个问题:stackoverflow.com/questions/188007/…
    • @Dabbas 为什么不使用 asp:Button?它将在客户端机器上呈现为常规 HTML,您可以为其分配服务器端方法!
    【解决方案2】:

    MyCustomControl 类中,定义接受(object sender, EventArgs e) 并返回void 的事件。

    然后添加(仍在 MyCustomControl 中)内部按钮的 click 事件的事件处理程序。
    在这些方法中,执行CustomClickEvent.Invoke()

    然后,在包含您的自定义控件的页面中,执行myControl.CustomClickEvent += new CustomClickEvent(name_of_method_within_page);

    【讨论】:

    • 请参阅我对“Zdravko Danev”回答的第一条评论。谢谢
    【解决方案3】:

    要从您的自定义控件呈现一个 asp 控件,请从 Render 基本方法执行此操作:

    protected override void Render(HtmlTextWriter writer)
    

    使用此方法在您的控件之前做好准备

    protected override void CreateChildControls()
    

    【讨论】:

      猜你喜欢
      • 2012-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-30
      • 1970-01-01
      • 2021-08-11
      • 2014-05-04
      • 1970-01-01
      相关资源
      最近更新 更多