如何将按钮数组传递到函数中
本文关键字:函数 数组 按钮 | 更新日期: 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);
}