有没有一种方法可以动态生成代码来与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...
    }
}