c# - 如何在没有名称的按钮上触发点击事件
问题描述
在我的代码中,按钮是自动制作的,我需要将按钮的信息保存在点击事件中。我正在 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++;
}
解决方案
编辑:添加 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 循环迭代变量。
推荐阅读
- php - Laravel 返回类 'Illuminate\Support\Facades\Storage\' 在目录中找不到任何存储功能
- python - 打包并克隆一个 Python venv
- python - 当多行具有相同的日期时,熊猫滚动和变换
- .net - 类中的 VB NET 列表不返回任何内容
- php - 评估对象数组内容的最快方法
- docker - 如何安装 docker-ce?对于版本 18.06.1~ce~3-0~debian
- c - 国旗是如何工作的?
- sql-server - 编写数据库中所有表的脚本
- microsoft-graph-api - 获取合影:ErrorAccessDenied
- spring-boot - 无法使用 Spring Cloud Kinesis Stream 启动 Spring Boot