【问题标题】:How to pass more params to Winform control event?如何将更多参数传递给 Winform 控件事件?
【发布时间】:2022-01-24 23:46:52
【问题描述】:

我尝试将 3 个额外的 int 参数传递给 button1_Click 事件

private void button1_Click(object sender, EventArgs e, int Xaxis, int Yaxis, int Zaxis)
    {
        switch (Xaxis)
        ...
        textBox1.Text = "Finished";
    }
...

实现↓↓↓

...
public void Func1()
   {
      button1_Click(sender, e, 16, 5, 59)   //Pass 16 5 59 to event button1_Click
      //To perform a click event simulation with designated params
      ...
   }

private void button2_Click(object sender, EventArgs e)
    {
        ...
        Func1();
    }

但是Form1.Designer.cs有问题

this.button1.Click += new System.EventHandler(this.button1_Click);
//Compiler Error CS0123: No overload for 'method' matches delegate 'delegate'

如何正确地将 3 个额外的 int 参数传递给 button1_Click 事件?

【问题讨论】:

  • 如果有人真的点击了按钮,当它调用事件时,你希望在你的额外参数中传递什么值?

标签: c# .net winforms .net-framework-4.8


【解决方案1】:

我建议提取一个方法,让我们分开业务逻辑axis 例程)和UI(按钮点击事件处理):

private void MyClick(Button button, int Xaxis, int Yaxis, int Zaxis) {
  //TODO: All business logic here
  switch (Xaxis)
  ...
  textBox1.Text = "Finished";
}

那就用吧

// Just UI event handler
private void button1_Click(object sender, EventArgs e) {
  //TODO: put right axis values here
  MyClick(sender as Button, 0, 0, 0);
}

public void Func1()
{
  MyClick(button1, 16, 5, 59);   // Pass 16 5 59 
  //To perform a click event simulation with designated params
  ...
}

// Another UI event handler
private void button2_Click(object sender, EventArgs e)
{
    ...
    Func1();
}

【讨论】:

    【解决方案2】:

    这是此答案的最通用版本,它以称为AxisAction 的形式完全定义了一个事件,它由不同的按钮订阅,以便用特定的参数触发。数据本身包含在一个名为Axisstruct 中,以便将{X,Y,Z} 保持在一起。

    // Your data model
    public readonly struct Axis
    {
        public Axis(int x, int y, int z)
        {
            this.X = x;
            this.Y = y;
            this.Z = z;
        }
    
        public int X { get; }
        public int Y { get; }
        public int Z { get; }
    }
    
    // Your event arguments
    public class MyEventArgs : EventArgs
    {
        public MyEventArgs(Axis axis)
        {
            Axis = axis;
        }
    
        public Axis Axis { get; }
    }
    
    // Your event method
    public delegate void AxisEventHandler(object sender, MyEventArgs e);
    
    public partial class Form1 : Form
    {
        // Your event
        public event AxisEventHandler AxisAction;
    
        public Form1()
        {
            InitializeComponent();
        }
    
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
    
            // Subscribe to event
            AxisAction += Form1_AxisAction;
        }
    
        private void Form1_AxisAction(object sender, MyEventArgs e)
        {
            // Handle the event here
            switch (e.Axis.X)
            {
                default:
                    break;
            }
            // done!
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
            // Trigger your event from the mouse click
            OnAxisAction(new MyEventArgs(new Axis(16, 5, 59)));
        }
        private void button2_Click(object sender, EventArgs e)
        {
            // Trigger your event from the mouse click
            OnAxisAction(new MyEventArgs(new Axis(-6, 2, 8)));
        }
    
        private void OnAxisAction(MyEventArgs e)
        {
            // Call any event handlers on event trigger
            AxisAction?.Invoke(this, e);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-15
      • 2017-01-05
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 2013-05-31
      • 2010-12-15
      相关资源
      最近更新 更多