首页 > 解决方案 > 如何在没有名称的按钮上触发点击事件

问题描述

在我的代码中,按钮是自动制作的,我需要将按钮的信息保存在点击事件中。我正在 WindowsForms 中编写 ShopSystem,当我单击一个按钮(也应该像单击 3 次一样工作)时,它应该位于下一个表单的文本框中,但我只需要帮助编写 clickevent。

while (id < artikelAnzahl)
{
    Button ArtikelID = new Button
    {
        Location = new Point(posX, posY),
        Size = new Size(100, 75),
    };
    posX += 120;
    double s = double.Parse(id.ToString()) / 5;

    if (int.TryParse(s.ToString(), out int i))
    {
        posY += 100;
        posX = 70;
    }
    this.Controls.Add(ArtikelID);

    foreach (var p in xmlArtikelliste.Descendants("Artikel"))
    {
        if (int.Parse(p.Attribute("ID").Value) == id)
        {
            ArtikelID.Text = p.Element("Name").Value + " " +
                p.Element("Preis").Value + "€ " +
                p.Element("Anzahl").Value + "Stk. ";
        }
    }
    id++; 
}

标签: c#

解决方案


编辑:添加 Click 事件委托不会起作用,因为按钮是在 a 中生成的,while loop并且事件处理程序的操作将始终具有上一次循环迭代的值。

因此,您可以通过以下方式实现您所需要的:

  • Button 的 Tag 属性用于存储数据

您可以存储来自 xmlArtikelliste.Descendants("Artikel") 的文章 ID,或者如果您愿意,可以存储整篇文章:

ArtikelID.Tag = p.Attribute("ID") 
  • 将添加到 Button 的 Click 事件的事件处理程序。

示例代码:

ArtikelID.Click += (sender, e) =>
{
    if(sender is Button button)
    {
        // Pass button.Tag.ToString() as parameter when navigating to the other form;
    }
};

您可以在官方文档中阅读更多相关信息。

完整代码:

while (id < artikelAnzahl)
{
    Button ArtikelID = new Button
    {
        Location = new Point(posX, posY),
        Size = new Size(100, 75),
    };
    posX += 120;
    double s = double.Parse(id.ToString()) / 5;

    if (int.TryParse(s.ToString(), out int i))
    {
        posY += 100;
        posX = 70;
    }
    this.Controls.Add(ArtikelID);

    foreach (var p in xmlArtikelliste.Descendants("Artikel"))
    {
        if (int.Parse(p.Attribute("ID").Value) == id)
        {
            ArtikelID.Text = p.Element("Name").Value + " " +
                p.Element("Preis").Value + "€ " +
                p.Element("Anzahl").Value + "Stk. ";

            ArtikelID.Tag = p.Attribute("ID");
        }
    }

    ArtikelID.Click += (sender, e) =>
    {
        if (sender is Button button && button.Tag != null)
        {
            // Pass button.Tag.ToString() as parameter when navigating to the other form;
        }
    };

    id++;
}

编辑 1: (sender, e)是事件处理程序的标准委托签名,它执行Action.

理想情况下,您可以创建一个按钮列表,添加按钮模板并将从 xmlArtikell 接收到的数据绑定到它。您可以查看以下有关 Win Forms 中数据绑定的介绍性教程

编辑 2:添加了将数据存储在 Button 的 Tag 属性中的解决方案,以便稍后在 Click 事件处理程序中使用它。否则,操作将始终使用最后一个 while 循环迭代变量。


推荐阅读