【问题标题】:How can i trigger a click event at a Button which has no name如何在没有名称的按钮上触发点击事件
【发布时间】:2020-10-06 09:40:35
【问题描述】:

在我的代码中,按钮是自动生成的,我需要将按钮的信息保存在点击事件中。我在 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++; 
}

【问题讨论】:

  • 你只想创建一个点击事件。这是否回答了您的问题:stackoverflow.com/questions/16807608/…
  • 事件处理程序不是按名称创建的。您是否尝试过添加事件处理程序? myButton.Click+=new EventHandler(...);
  • @BuhBuh 我不能接受正常的点击事件,因为我的按钮没有名称。我从 xml 文件中取出信息。有一个你可以买的东西的清单,我需要找到另一种方法来制作点击事件。
  • @PanagiotisKanavos 我的问题是,“myButton”我的按钮没有名称,我的 xml 列表中有 ID,我不能这样做。
  • 我不明白。您确实有对该按钮的引用。这是变量ArtikelID

标签: c#


【解决方案1】:

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

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

  • 按钮的 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;
    }
};

你可以在官方docs了解更多。

完整代码:

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 中数据绑定的介绍性 tutorial

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

【讨论】:

  • 感谢您对我的帮助。但我希望能够单击多次,例如添加 2 根胡萝卜和 3 根香肠,然后我想单击“下一页”按钮
  • 这与提出的问题完全不同。请将此问题的答案标记为已接受并发布新答案,我们将尽力提供帮助。此外,最好表明您在发布问题之前已经对该主题进行了一些研究。
  • 另外,你必须在WinForms开发这个ShopSystem吗? WPFWinForms 的更好和现代的替代品。我建议看看WPF,如果可能的话切换到它。
  • 我在学习工作,这是必须的,也是我的第一个月。
  • 一切顺利,祝你好运!我强烈建议您阅读基础 C# 教程,同时阅读 WinForms 教程,这将对您有很大帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-01
  • 1970-01-01
  • 2018-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多