【问题标题】:Creating unique event handlers for dynamically created buttons为动态创建的按钮创建唯一的事件处理程序
【发布时间】:2013-09-23 19:59:52
【问题描述】:

我想动态地向我的页面添加按钮。这将取决于 SELECT 语句的结果数。我

   protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            for (int i = 0; i < Query.length; i++)
            {
                 Button btn = new Button();
                 btn.ID = "Button" + i;
                 btn.Click += new EventHandler(btn_Click());
                 btn.Text = i.ToString();
                 pagingPanel.Controls.Add(btn);
           }
        }
    }

但我希望每个按钮都有自己的自定义事件处理程序。如果我单击一个按钮,我希望它与单击另一个按钮的结果不同。我想做这样的事情,我可以传递一个附加参数:

protected void btn_Click(object sender, EventArgs e, string test)
{
    System.Diagnostics.Debug.WriteLine(test);
}

也许我不知道要传递哪些对象?或者我可能以错误的方式处理这个问题。

如何达到预期的效果?

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    试试这个:

    protected void Page_Load(object sender, EventArgs e)
    {
            // you do not use !IsPostBack here
            //count of func must be equal with 'Query.Length'
            string[,] arr ={
                             {"func1","hello world"},
                             {"func2","Hello ASP.NET"}
                         };
            for (int i = 0; i < Query.Length; i++)//I assume length is 2
            {
                 Button btn = new Button();
                 btn.ID = arr[i, 0];
                 btn.CommandArgument = arr[i, 1];
                 btn.Click += new EventHandler(btn_Click);
                 btn.Text = i.ToString();
                 pagingPanel.Controls.Add(btn);
           }
    }
    protected void btn_Click(object sender, EventArgs e)
    {
        Button btn = (Button)sender;
        System.Reflection.MethodInfo methodInfo = typeof(_Default2).GetMethod(btn.ID); //_Default2 is class name of code behind
        if (methodInfo != null)
        {
            object[] parameters = new object[] { btn.CommandArgument};
            methodInfo.Invoke(this,parameters);
        }
    }
    public void func1(object args)
    {
        string test = args.ToString();
        Response.Write(test);
    }
    public void func2(object args)
    {
        string test = args.ToString();
        Response.Write(test);
    }
    

    【讨论】:

      【解决方案2】:

      首先 - 无论是否回发,您都必须创建按钮。按钮点击是回发的原因,如果您没有按钮 - 会点击什么?

      其次,添加到你的页面类:

      Dictionary<Button, ButtonInfo> fButtonLookup = new Dictionary<Button, ButtonInfo>();
      

      然后,在哪里创建按钮:

      fButtonLookup.Clear();
      for (int i = 0; i < Query.length; i++)
      {
        Button btn = new Button();
        fButtonLookup.Add(btn, new ButtonInfo() { whatever information about this button you want to keep});
        ...
      }
      

      然后,在您的按钮中单击:

      protected void btn_Click(object sender, EventArgs e)
      {
        Button btn = (Button)sender;
        if (fButtonLookup.ContainsKey(btn))
        {
          ButtonInfo info = fButtonLookup[btn];
          // do waht you need with button information
        }
      }
      

      【讨论】:

        【解决方案3】:

        您只需检查sender 即可查看点击了哪个按钮:

        protected void btn_Click(object sender, EventArgs e)
        {
            if (sender == btnOne)
                performBtnOne("foo");
            else if (sender == btnTwo)
                performButtonTwo("bar");
        }
        

        【讨论】:

        • 你的意思是发件人的ID?
        • 我明白你的意思,但问题是我不一定知道什么,但我事先不知道 btnOne 或 btnTwo 会做什么。这将取决于用于创建按钮的 SELECT 语句的结果
        【解决方案4】:

        扩展 itsme86...

        protected void btn_Click(object sender, EventArgs e)
        {
            Button btn = (Button)sender;  //Now you have an instantiated version of the button pressed.
            switch (btn.Name)
            {
                case "foo":
                    performBtnOne();
                    break;
                case "bar":
                    performBtnTwo();
                    break;
                default:
                    performUnexpectedButton();
                    break;
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2017-07-29
          • 1970-01-01
          • 2015-03-02
          • 2016-08-20
          • 2014-03-12
          • 1970-01-01
          • 2018-04-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多