0

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

不能手动添加 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”的 Button 控件,但如何找到“具有特定属性的按钮,例如查找名为 btn 且 tooltip=1A 的按钮。我将浏览所有工具提示(1A,... 10N)并检查每个按钮(考虑到它们有独特的工具提示),每次检查颜色。对于每个红色,我计算一个按钮。

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

编辑>>>>>>> 我尝试了 Ben 的建议,但现在的问题是,当我单击其中任何一个按钮时,所有按钮都会消失。谢谢你的耐心。

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;
        }
    }
4

3 回答 3

1

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

我强烈建议您阅读这个 msdn 页面,它解释了您所询问的所有内容。

于 2012-06-15T18:30:08.057 回答
0

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

  1. 易于实现,因为它会在客户端运行,所以速度非常快
  2. 通过使用适当的选择器轻松获取单击按钮的计数(您可以使用按钮的任何属性,例如 ID、CSSClass 甚至是按钮的名称。

我的建议:

  1. 在 JQuery 中,在文档加载时添加具有不同 ID 但名称相同的输入(类型=按钮)(例如“btn”)。
  2. 在 JQuery 中编写另一个事件,该事件将监听所有名称为“btn”的按钮的按钮单击。在该函数中,使用 Style 属性更改按钮的颜色。
  3. 最后,如果您想找出有多少按钮是红色的,也可以通过使用 JQuery 并使用适当的样式选择器
于 2012-06-15T18:53:59.997 回答
0

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

像这样的伪代码:

       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_++;
    }
于 2012-06-15T18:29:31.230 回答