C#制作自己的按钮并传递参数

C# making own button and passing argument

我们使用 C# 表单应用程序作为自动化项目的 HMI。 在执行此操作时,我们通常使用按钮单击事件。这些事件将布尔值从 false 更改为 true。我的问题从这里开始。 有很多布尔值,如果我一个一个地添加按钮事件,我会花费很多很多次。所以我想做我自己的按钮组件和。我将从工具箱中拖放我的按钮,并使用属性 window 将其与布尔值相关联。这样做之后,它会自动代替我做所有事情。按钮设计对我来说不重要。

示例:

//Define Variables
public class PLCVars
{
    public bool PLCVar1;
    public bool PLCVar2;
    public bool PLCVar3;
    public bool PLCVar4;
    public bool PLCVar5;
    public bool PLCVar6;
    public bool PLCVar7;
    public bool PLCVar8;
}

//(!)I have a PLCVars object defined as PLCVariables
//Button Events 
private void button_JogPLCVar1_MouseDown(object sender, MouseEventArgs e)
{
    PLCVariables.PLCVar1 = true;
}

private void button_JogPLCVar1_MouseUp(object sender, MouseEventArgs e
{
    PLCVariables.PLCVar1 = false;
}

如上例所示,我想将我的按钮组件与 plc 变量相关联。它会自动生成所有mouseup和mousedown事件并改变plc变量的值。

根据我的搜索,我应该使用自定义控件。但我不知道将表单变量与自定义控件组件相关联是否可行。如果可以怎么办?

不需要自定义控件。将所有按钮订阅到这两个事件处理程序。您需要做的就是获取 PLCVar# 字段名称。您可以为此使用按钮的 Tag 属性。为标签PLCVar1PLCVar2等分配字段名,然后在事件处理程序中获取字段名并通过反射分配值:

private void button_JogPLCVar_MouseDown(object sender, MouseEventArgs e)
{
    Button button = (Button)sender;
    SetPLCVariable((string)button.Tag, true);
}

private void button_JogPLCVar_MouseUp(object sender, MouseEventArgs e
{
    Button button = (Button)sender;
    SetPLCVariable((string)button.Tag, false);
}

private void SetPLCVariable(string fieldName, bool value)
{
    Type type = typeof(PLCVars);
    FieldInfo fieldInfo = type.GetField(fieldName);
    fieldInfo.SetValue(PLCVariables, true);
}

正在创建和订阅所有按钮

 panel1.Controls.Clear();

 for (int i = 1; i < 5; i++)
 {
     Button button = new Button();
     button.Name = "Button" + i;
     button.Tag = "PLCVar" + i;
     button.MouseUp += button_JogPLCVar_MouseUp;
     button.MouseDown += button_JogPLCVar_MouseDown;
     panel1.Controls.Add(button);
 }

注意:最好使用属性而不是 public 字段。对于属性,您需要使用 type.GetProperty 方法。另外最好使用 FlowLayoutPanel.

您可以简单地通过将面板放入窗体并动态创建按钮控件并将事件附加到创建的控件来完成此操作。

这里是一行示例(需要修改)

public class PLCVars
{
    public bool PLCVar1;
    public bool PLCVar2;
    public bool PLCVar3;
    public bool PLCVar4;
    public bool PLCVar5;
    public bool PLCVar6;
    public bool PLCVar7;
    public bool PLCVar8;

    public bool[] BooleanVars()
    {
        return new bool[] { PLCVar1, PLCVar2, PLCVar3, PLCVar4, PLCVar5 };
    }
}

public void Method()
{
     PLCVars v = new PLCVars();

     panel1.Controls.Clear();

     for (int i = 1; i < 5; i++)
     {
         Button button = new Button();
         button.Name = "Button" + i;
         button.MouseUp += delegate 
         {
             v.BooleanVars()[i] = false;
         };
         button.MouseDown += delegate
         {
             v.BooleanVars()[i] = true;
         };

         panel1.Controls.Add(button);
     }
}

更新后我看到您想创建一些按钮并使用这些按钮管理某些对象的属性。这是更好的解决方案。

首先 - 您应该使用 FlowLayoutPanel 来托管您的按钮。按钮将动态定位。

其次 - 你不应该使用按钮。使用 CheckBoxes 按钮的外观。因为你需要管理布尔属性。

Thirs - 您应该将 PLCVars 字段更改为属性。因为我们要使用数据绑定。它不适用于字段:

public class PLCVars
{
    public bool PLCVar1 { get; set; }
    public bool PLCVar2 { get; set; }
    public bool PLCVar3 { get; set; }
    public bool PLCVar4 { get; set; }
    public bool PLCVar5 { get; set; }
    public bool PLCVar6 { get; set; }
    public bool PLCVar7 { get; set; }
    public bool PLCVar8 { get; set; }
}

现在您不需要任何事件处理程序或自定义按钮。如果你想创建 UI 来控制 PLCVariables 对象的属性,你只需要将复选框添加到面板并将它们绑定到你的对象。简单:

int numberOfVlcVariables = typeof(PLCVars).GetProperties()
      .Count(p => p.Name.StartsWith("PLCVar"));

for(int i = 1; i <= numberOfVlcVariables ; i++)
{
    CheckBox cb = new CheckBox();
    cb.Appearance = Appearance.Button;
    cb.Text = "PLCVar" + i;
    cb.DataBindings.Add("Checked", PLCVariables, "PLCVar" + i);
    flowLayoutPanel1.Controls.Add(cb);
}

创建和安排切换 'buttons'。每个按钮控制 PLCVariables 对象的适当 属性。 IE。按下按钮时,表示 属性 设置为 true。如果按钮弹起,则 属性 等于 false.

甚至更简单但不太酷的选项 - 您只需将 PropertyGrid 控件添加到您的表单并为其分配 PLCVariables 对象:

propertyGrid1.SelectedObject = PLCVariables;

结果: