如何将按钮数组传递给函数

时间:2015-12-16 21:32:08

标签: c# arrays button

我试图创建一个函数,它会将一个串行字符串发送到一个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 
}

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

解决问题的一种方法是通过从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);
}

答案 2 :(得分:0)

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

buttonArray[i].Tag = i;

然后,编写单个事件处理程序。在处理程序内部,您可以访问导致处理程序触发的任何按钮单击的标记,并将该值传递给您的函数。

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