如何对第二表单执行主表单按钮功能

本文关键字:表单 执行 按钮 功能 | 更新日期: 2023-09-27 18:12:12

我有一个主要形式的按钮,当单击时启动相机的函数,我希望该开始函数也以第二种形式执行,该函数包含条件语句if和else。通常我做一个public void Name,然后把函数放进去,然后我做一个第二种形式的构造函数来调用那个函数,但是这次不起作用。反过来呢?

  public void startProg()
        {
            if (start.Text == "&Start")
            {
                if (DeviceExist)
                {
                    videoSource = new VideoCaptureDevice(videoDevices[comboBox1.SelectedIndex].MonikerString);
                    videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame);
                    CloseVideoSource();
                    videoSource.DesiredFrameSize = new Size(1366, 768);
                    //videoSource.DesiredFrameRate = 10;
                    videoSource.Start();
                    lblCam.Text = "Device running...";
                    start.Text = "&Stop";
                }
                else
                {
                    lblCam.Text = "Error: No Device selected.";
                }
            }
            else
            {
                if (videoSource.IsRunning)
                {
                    CloseVideoSource();
                    lblCam.Text = "Device stopped.";
                    start.Text = "&Start";
                }
            }
        }
   private void start_Click(object sender, EventArgs e)
        {
              startProg();
        }

第二种形式

 private void Close(object sender, FormClosingEventArgs e)
        {
            frmMain main = new frmMain();
main.startProg();
        }

如何对第二表单执行主表单按钮功能

虽然您没有指出为什么它"不起作用"或它是如何失败的,但我建议在第一个表单订阅的第二个表单中创建一个事件(参见事件教程)。在第二个表单中触发事件后,第一个表单就可以执行与按下按钮时相同的操作。

在我看来,你只需要一个static类和方法来做到这一点-我确信这不是需要状态的东西,所以把实际的API调用放在这样的类中启动相机:

public static class Camera
{
    public static void Start() { ... }
}

,然后像这样调用:

Camera.Start();

您可以通过传递方法将相机从form1启动到form2来实现这一点。

我举了一个非常简单的例子。

第一个表单的代码是:
public Form1()
{
    InitializeComponent();
    this.button1.Click += delegate { ShowMessageBoxFromForm1(); };
    this.button2.Click += delegate
        {
            Form2 form2 = new Form2(ShowMessageBoxFromForm1);
            form2.ShowDialog();
        };
}
private void ShowMessageBoxFromForm1()
{
    MessageBox.Show("I'm in Form1");
}

表单上只有两个按钮。

第二个表单(Form2)的代码是:
public partial class Form2 : Form
{
   private readonly Action action;
   public Form2(Action action)
   {
       InitializeComponent();
       this.action = action;
   }
   private void button1_Click(object sender, EventArgs e)
   {
       this.action.Invoke();
   }
}

上面只有一个按钮

如果你想在多个表单上使用某些函数,你应该在单独的类中编写函数。使用该类的对象,您应该调用该函数。

但如果您仍想按照您的方式继续,请尝试执行

创建创建StartCamera()方法的第一个Form对象。确保StartCamera()方法是公共的。现在是第二种形式:

Form1 frmObj=new Form1();
frmObj.StartCamera();