我试图创建一个函数,它会将一个串行字符串发送到一个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
}
非常感谢任何帮助!
答案 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);
}