单击按钮时在表单之间传递变量

jim*_*utt 2 .net c# parameter-passing winforms

我有两个表格.一个用于执行所有主要代码的地方.使用此方法单击菜单项时,将显示另一种形式:

Form2 videoSettings = new Form2();       

private void videoToolStripMenuItem_Click(object sender, EventArgs e)
{
    videoSettings.Show();
}
Run Code Online (Sandbox Code Playgroud)

然后打开的表单包含用户可以为应用程序设置一些设置的字段. 在此输入图像描述 然后单击"保存"按钮时我想要这个变量:public int deviceIndex; 从原始表单中获取.

所以我想知道我是否可以在Form1中添加任何事件或什么东西来检测在videoSettings(Form2)中点击保存按钮的时间?

Vla*_*lad 6

我会以不同的方式做到这一点.我将UI处理和业务逻辑层之间的代码分开.所以你的场景会以这样的方式运行:

  1. 第一个表单发出一个事件,通知已激活具有某些语义的按钮.处理所需的数据包含在事件的数据中.
  2. 业务逻辑侦听此事件,并决定在第二个表单上发出命令.它在表单的类上调用一个合适的方法,将所需的信息作为参数传递(如果需要,可以预处理参数).
  3. 第二个表单从业务逻辑接收命令并更新视图.

这样就不会出现问题了.


示例:(我不是winforms专家,请注意最佳winforms实践的POV可能完全错误.)

第1部分(第一表格):

class ProcessingActivatedEventArgs : EventArgs
{
    public ProcessingActivatedEventArgs(int data) { MoreData = data; }
    public int MoreData { get; protected set; }
}

class Form1 : Form
{
    private int currentData;
    public event EventHandler<ProcessingActivatedEventArgs> ProcessingActivated;
    void OnButtonClick(object sender, EventArgs args)
    {
        // ...
        if (ProcessingActivated != null)
            ProcessingActivated(new ProcessingActivatedEventArgs(currentData));
    }
}
Run Code Online (Sandbox Code Playgroud)

第2部分:(业务逻辑)

class Controller
{
    Form1 f1;
    Form2 f2;

    void StartFirstForm()
    {
        f1 = new Form1();
        f1.ProcessingActivated += OnProcessingActivated;
        f1.Show();
    }

    void OnProcessingActivated(object sender, ProcessingActivatedEventArgs args)
    {
        int data = args.MoreData;
        f1.DisableProcessingRequests();
        model.ProcessingFinished += OnProcessingFinished;
        model.StartProcessing(data);
        if (data > 0)
            f2.DisplayDataProcessing(0, data);
        else if (data < 0)
            f2.DisplayDataProcessing(data, 0);
        else
            throw new SomeCoolException("impossible data");
    }
}
Run Code Online (Sandbox Code Playgroud)

第3部分:(第二种形式)

class Form2 : Form
{
    public void DisplayDataProcessing(int lower, int upper)
    {
        // ... update the UI
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,此实现将Controller表单与形式紧密联系起来.在WPF中,通过使用适当的DataContext(但我不知道如何在WinForms中正确地执行)来实现解耦.

  • @caesay:如果您习惯于将事件和代码直接放入表单中,这可能最初看起来很复杂,但随着应用程序变大,它会更好地扩展,并且转换成大球的可能性要小得多泥 (2认同)