代码生成的按钮

时间:2012-06-15 18:21:10

标签: c# asp.net visual-studio-2008

关于页面加载时代码生成按钮的大问题VERSUS在设计视图中手动添加按钮。

您无法手动添加140个按钮,因此我更喜欢代码。 所有按钮在按钮点击时的行为类似(它们会改变颜色)。我显然无法编写140个点击事件方法,那么如何才能使能够适用于所有的一般事件?

我想过这样做:

protected void btn_Click(object sender, EventArgs e)
        {
            Button btn1 = Panel2.FindControl("btn") as Button;
            btn1.BackColor = Color.Red;
         }

因为所有按钮都被称为btn。

这就是我添加按钮的方式:

for (int a = 1; a <= 10; a++)
            {
                for (char b = 'A'; b <= 'N'; b++)
                {
                    btn = new Button();
                    btn.Text = "";
                    btn.Height = 20; btn.Width = 20;
                    btn.ToolTip = a + " " + b;
                    Panel2.Controls.Add(btn);
                }
                Panel2.Controls.Add(new LiteralControl("<br/>")); // this inserts a paragraph

            }

我不知道btn_Click(object sender, EventArgs e)是否有效,因为点击按钮后全部消失。 我该如何解决?

最后,我需要计算多少个按钮为红色。我的以下想法是否实用?我们知道如何找到名为“btn”的按钮控件,但是我如何找到“具有特定属性的按钮,例如找到名为btn的按钮,其中tooltip = 1A。我将通过所有工具提示(1A,... 10N)并检查每个按钮(考虑到它们具有独特的工具提示),并且每次都检查颜色。对于每种红色,我都会计算一个按钮。

它是一个问题是它们都被称为“btn”吗?现在我可以通过工具提示区分它们:1A,1B,... 10N,正如我所说。非常感谢。

修改&GT;&GT;&GT;&GT;&GT;&GT;&GT;我尝试了Ben的建议,现在的问题是当我点击任何按钮时所有按钮都会消失。感谢yoru的耐心。

public partial class Seatalloc2 : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                PopulateControls();
            }
        }

        protected void PopulateControls()
        {

            Panel1.Visible = true;
            Button btn;

            Panel2.Visible = true;
            DropDownList nrbileteddl = Panel1.FindControl("nrBileteddl") as DropDownList;
            nrbileteddl.Visible = true;

            for (int i = 1; i <= 5; i++)
            {
                nrbileteddl.Items.Add(i + "");
            }

            for (int a = 1; a <= 10; a++)
            {
                for (char b = 'A'; b <= 'N'; b++)
                {
                    btn = new Button();
                    btn.Text = "";
                    btn.Height = 20;
                    btn.Width = 20;
                    btn.ToolTip = a + " " + b;
                    btn.BackColor = Color.Green;
                    btn.Click += new EventHandler(btn_Click);
                    Panel2.Controls.Add(btn);
                }
                Panel2.Controls.Add(new LiteralControl("<br/>"));
            }
        }

        protected void btn_Click(object sender, EventArgs e)
        {
            Button btn = sender as Button;
            btn.BackColor = Color.Red;
        }
    }

3 个答案:

答案 0 :(得分:1)

你在这里问几个不同的问题。
您可以创建动态按钮(或任何其他控件),但为了使它们与页面生命周期,事件和视图状态保持同步,您需要在页面生命周期的初始化阶段创建它们(我无法理解你的代码,如果这是你正在做的事情)
您调用了变量“btn”,但这不是如何在ASP.NET中识别控件。它们中的每一个都有一个ID(和一个UniqueID),这些ID应该是唯一的。如果将相同的事件处理程序附加到按钮,则不需要在事件处理程序中找到触发按钮,它是作为事件处理mehotd的一部分而接收的发送方对象。

我强烈建议您阅读this msdn page,其中解释了您询问的所有内容。

答案 1 :(得分:0)

您需要做的就是在每个Button.Click上挂钩一个事件处理程序。这将使Sender成为Button,因此您可以将其转换为Button,将其颜色设置为Red。并且在相同的方法中,您将增加一些局部字段以增加红色按钮的数量。

像这样的伪代码:

       int red_ = 0;
    void Method()
    {
        for(int i=0; i< 100; i++)
        {

            Button btn = new Button();
            btn.Click += new EventHandler(btn_Click);
        }
    }

    void btn_Click(object sender, RoutedEventArgs e)
    {
        Button btn = sender as Button;
        // set btn to red
        red_++;
    }

答案 2 :(得分:0)

为ASP.NET控件提供相同的ID将无法获取所需的结果。如果更改按钮的颜色是唯一的要求,我强烈建议使用JQuery,原因如下:

  1. 易于实施,因为它将在客户端运行,它会非常快
  2. 使用适当的选择器轻松获取点击按钮的数量(您可以使用按钮的任何属性,例如ID,CSSClass或按钮的名称。
  3. 我的建议:

    1. 在JQuery中,在文档加载中添加具有不同ID但名称相同的输入(类型=按钮)(例如“btn”)。
    2. 在JQuery中编写另一个事件,该事件将听取名为“btn”的所有按钮的按钮单击。在该函数内部,使用Style属性更改按钮的颜色。
    3. 最后,如果你想找到多少个红色按钮,那么通过使用适当的Style选择器来使用JQuery也是可能的