有没有一种方法可以动态生成代码来与C#中的按钮交互?
我正试图找到一种能够基于输入动态生成代码的方法 例如,我可以键入如下内容:有没有一种方法可以动态生成代码来与C#中的按钮交互?,c#,winforms,C#,Winforms,我正试图找到一种能够基于输入动态生成代码的方法 例如,我可以键入如下内容: int Number = 22; Button<Number>.Text = "X"; int Number=22; Button.Text=“X”; 因此,在本例中,它会将button22设置为文本为“X” 我可以修改它,这样我可以输入,比如24到程序中,然后它会将button24设置为“X”,而不是设置一堆if语句来覆盖每个可能的按钮按下 对于进一步的上下文,我有一个64个按钮的网格,我需要能够单独编
int Number = 22;
Button<Number>.Text = "X";
int Number=22;
Button.Text=“X”;
因此,在本例中,它会将button22设置为文本为“X”
我可以修改它,这样我可以输入,比如24到程序中,然后它会将button24设置为“X”,而不是设置一堆if语句来覆盖每个可能的按钮按下
对于进一步的上下文,我有一个64个按钮的网格,我需要能够单独编辑它们,以向用户显示已按下的按钮,有很多if语句可以实现这一点,但我认为可能值得尝试找到一个更优雅的解决方案。也许您可以保留一个
按钮的列表引用
:
var myButtons=newlist();
添加(第一个按钮);
添加(第二个按钮);
// ... 等
// ... 然后去别的地方
整数=3;
myButtons[number].Text=“xxx”;
您可以有一个按钮列表:
private List<Button> _buttons = new List<Button>();
按钮具有标记属性,可用于保存有关按钮的任意数据,这在和中进行了描述。
中演示了类似于OP要求的简单用法
从实际意义上讲,这种情况正是.Tag
从c#诞生时就存在于用户界面控件中的原因
因此,您不需要为按钮使用自定义类,只需将您的值分配给通过编程方式创建的按钮
类上的.Tag
属性即可:
在本例中,一个列表用于创建按钮并将创建与布局分开,不需要这样做,但可能有用。相反,您可以将此按钮指定给其父容器和/或设置布局边距或坐标,而无需保留对按钮
对象的引用。
如果OP更新文章以包含实现示例,我们可以使用更具体和完整的代码更新此响应
私有列表按钮=新列表();
// ... 迭代或切换逻辑
var nextButton=新建按钮
{
Text=“x”,
标签=22
};
下一个按钮。单击+=动态按钮\u单击;
_按钮。添加(下一个按钮);
// ... 稍后将按钮推入父容器或绑定到UI
然后单击按钮处理程序,您可以访问此标记属性:
这是由WinForms提供的,UWP或WPF的唯一区别是方法签名,将EventArgs
更改为RoutedEventArgs
使用这些概念,一旦按钮被创建,比如说在一些简单的网格对齐中,如果您有一个可以从代码访问的文本框(或其他)输入字段,那么您可以允许用户在运行时设置这个标记
值
我建议您为此使用MVVM样式的绑定,而不是直接引用TextBox控件,但这只是为了说明这一点
现在每个按钮都有一个标记,您可以通过迭代其他按钮并清除先前分配给不同按钮的标记,轻松添加逻辑来维护唯一的标记值
保存列表/数组中的所有按钮,并使用索引器访问它们。WinForms、WPF、UWP。。。简短的回答当然是肯定的,但VisualStudio标记与此无关。请包含一段代码,说明如何将按钮添加到UI,如如何定义其布局或视觉状态。这样我们就可以提供一个具体的例子,而不是在黑暗中拍摄,因为这可以通过许多不同的方式实现。
for (int i = 0; i < 10; i++)
{
var b = new Button();
b.Text = $"Button #{i}";
b.Click += HandleButtonClick;
}
private void HandleButtonClick(object sender, EventArgs e)
{
(sender as Button).Text = "X";
}
private void DynamicButton_Click(object sender, EventArgs e)
{
if(int.TryParse((sender as Button).Tag?.ToString(), out int buttonValue))
{
// use buttonValue
Console.Out.WriteLine(buttonValue);
}
else
{
// Otherwise, sender was not a button, or the button did not have an integer tag value
// either way, handle that error state here...
}
}
private void DynamicButton_Click(object sender, EventArgs e)
{
// assign the string value from the ButtonValueTextbox control to this button
string value = this.ButtonValueTextBox.Text;
if(sender is Button button)
{
button.Tag = value;
}
else
{
// Otherwise, sender was not a button
// handle the error state here if you need to...
}
}