如何将按钮数组传递到函数中

本文关键字:函数 数组 按钮 | 更新日期: 2023-09-27 18:27:02

我正在尝试创建一个函数,该函数将向com端口发送一个串行字符串,并在每次按下按钮时更改颜色。

我已经想好了如何用一个按钮来实现这一点,但现在我想制作一个由140个按钮组成的数组,这些按钮都可以通过这个函数传递。

我的问题是,所有140个按钮都执行第一个按钮的功能,而不是它们各自的功能,即发送不同的串行命令,当它打开时变为蓝色

这是我的代码:

public partial class Form1 : Form
{
    bool[] buttonStatus = new bool[140];
    Button[] buttonArray = new Button[140];
    private SerialPort LB;//"LB for left bottom module
    public Form1()
    {
        InitializeComponent();
        Initializing();
        CreatingNewButtons();
    }
    /// <summary>
    /// Initializes Serial ports to be used
    /// </summary>
    private void Initializing()
    {
        try
        {
            LB = new SerialPort();
            LB.BaudRate = 57600;
            LB.PortName = "COM9";
            LB.Open();
        }
        catch(Exception)
        {
            MessageBox.Show("error connecting");
        }
    }
    /// <summary>
    /// Creates all 140 buttons at startup
    /// </summary>
    private void CreatingNewButtons()
    {
        int horizotal = 80;
        int vertical = 30;
        for (int i = 0; i < buttonArray.Length; i++)
        {
            buttonArray[i] = new Button();
            buttonArray[i].Size = new Size(25, 25);
            buttonArray[i].Location = new Point(horizotal, vertical);
            if ((i == 10) || (i == 20) || (i == 30) || (i == 40) || (i == 50) ||
                (i == 60) || (i == 70) || (i == 80) || (i == 90) || (i == 100) || 
                (i == 110) || (i == 120) || (i == 130))
            {
                vertical = 30;
                horizotal = horizotal + 30;
            }
            else
                vertical = vertical + 30;
            this.Controls.Add(buttonArray[i]);
            // Add a Button Click Event handler
            buttonArray[i].Click += new EventHandler(buttonArray_Click);
        }
    }
    void sendStringToAllModules (string stringToSend)
    {
        LB.WriteLine(stringToSend);//write string text to arduino
    }
    private void sendStringBtn_Click(object sender, EventArgs e)
    {
        LB.WriteLine(stringTextBox.Text);//write string text to arduino
    }
    private void receiveStringBtn_Click(object sender, EventArgs e)
    {
        receiveStringTextBox.Text = LB.ReadExisting();
    }
    #region pushbuttonCode
    /// <summary>
    /// send function index and sends either on or off to leds of modules
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    void toggleLEDs(int i)
    {
        if (!buttonStatus[i])
        {
            sendStringToAllModules("1;" + i + ";");
            buttonArray[i].BackColor = Color.CornflowerBlue;
            buttonStatus[i] = !buttonStatus[i];
        }
        else
        {
            sendStringToAllModules("2;" + i + ";"); 
            buttonArray[i].BackColor = Color.Gainsboro; 
            buttonStatus[i] = !buttonStatus[i]; 
        } 
    } 
    private void buttonArray_Click(object sender, EventArgs e)//this button works
    {
        toggleLEDs(0);
    }
    private void buttonArray1_Click(object sender, EventArgs e)//this one doesn't
    { 
        toggleLEDs(0); 
    } 
    #endregion 
}

非常感谢您的帮助!

如何将按钮数组传递到函数中

sender参数将是实际按下的按钮。在buttonArray中找到它的索引,并将索引作为参数发送到toggleLED。

解决问题的一种方法是通过从System.Windows.Forms.Button 派生按钮类型来创建自己的按钮类型

public class CommandButton : Button
{
    public Action<CommandButton> Execute { get; set; }
    public CommandButton (Action<CommandButton> action)
    {
        Execute = action;
    }
}

现在,您可以通过将所需的操作作为lambda表达式传递给按钮来创建按钮:

var button = new CommandButton(btn => { 
    MessageBox.Show("I am button " + btn.Name);
    toggleLEDs(0);
    btn.BackColor = Color.Gainsboro;
});

您也可以直接将具有正确签名的方法的方法名传递给它:

void MyMethod(CommandButton button)
{
    DoSomething();
}
...
var button = new CommandButton(MyMethod);

然后你可以执行这样的操作:

private void buttonArray_Click(object sender, EventArgs e)
{
    var button = (CommandButton)sender;
    button.Execute(button);
}

您可以使用System.Windows.Forms.Label.Tag属性来标识每个按钮。在按钮创建循环中添加以下行:

buttonArray[i].Tag = i;

然后,编写一个单独的事件处理程序。在处理程序内部,您可以访问导致处理程序启动的按钮的Tag,并将该值传递给您的函数。

private void buttonArray_Click(object sender, EventArgs e)
{
    toggleLEDs((Button)sender.Tag);
}