从父窗体获取值

本文关键字:获取 窗体 | 更新日期: 2023-09-27 18:34:40

在我的应用程序中,我有一个主窗体,它是所有其他窗体的 MdiParent。登录时,默认情况下会打开此表单,然后从此表单的菜单栏中导航到其他表单,如下所示:

public partial class MainMenuForm : Form
{
    public MainMenuForm()
    {
        InitializeComponent();
        this.WindowState = FormWindowState.Maximized;
    }
    private void humanResourceToolStripMenuItem_Click(object sender, EventArgs e)
    {
        HumanResourceForm humanresourceform = new HumanResourceForm();
        humanresourceform.MdiParent = this;
        humanresourceform.Show();
    }
}

HumanResourceForm内,我有一个按钮,它将导航到另一个表单,上面写着EmployeeTransferForm

private void button1_Click(object sender, EventArgs e)
{
    Administraror.Humanresource.EmployeeTransferForm emptranfrm = new Administraror.Humanresource.EmployeeTransferForm();
    emptranfrm.ShowDialog();
}

现在我的问题在EmployeeTransferForm我想从HumanResourceForm的控件中获取一些值。此外,不应允许用户在EmployeeTransferForm打开或活动时关闭人力资源窗体。

我还想获取HumanResourceForm文本框的 Text 属性,如下所示EmployeeTransferForm

public partial class EmpLoctnChangeForm : Form 
{
    public EmpLoctnChangeForm( )
    {
        InitializeComponent();
    }
    private void EmpLoctnChangeForm_Load(object sender, EventArgs e)
    {
        intemppk = humanresourceform.txtpk.text;
    }
}

期待大家的一些好建议。
提前谢谢。

从父窗体获取值

我建议您在类中定义一些事件EmployeeTransferForm(要获取属性值的表单(并在Humanresources(要访问其属性的形式(中实现它们。我不建议在面向对象的体系结构中传递整个Form对象。

因此,EmployeeTransferForm形式的代码可能如下所示:

public class EmployeeTransferForm: Form
{
    public delegate Text GetTextHandler();
    GetTextHandler getSampleTextFromTextBox = null;
    public event GetTextHandler GetSampleTextFromTextBox
    {
        add { getSampleTextFromTextBox += value; }
        remove { getSampleTextFromTextBox -= value; }
    }
    //the rest of the code in the class
    //...
}

而对于Humanresources,像这样:

class Humanresources : Form
{
    private void button1_Click(object sender, EventArgs e)
    {
        Administraror.Humanresource.EmployeeTransferForm emptranfrm = new Administraror.Humanresource.EmployeeTransferForm();
        emptranfrm.GetSampleTextFromTextBox += new EmployeeTransferForm.GetTextHandler(GetSampleTextFromTextBox_EventHandler);
        emptranfrm.ShowDialog();
    }

    Text GetSampleTextFromTextBox_EventHandler()
    {
        return myTextBox.Text;
    }
    //the rest of the code in the class
    //...
}

您可以创建一个公共静态变量以从其他地方访问它:

public static HumanResourceForm Instance;

然后在构造函数中设置值:

Instance = this;

然后在您的 EmpLoctnChangeForm 中:

intemppk = HumanResourceForm.Instance.txtpk.Test;

也许可以考虑实现某种"视图控制器",它负责这些"跨视图"通信和表单创建。这种方法可以更好地封装创建表单(视图(并在它们之间共享数据的过程。它将提供较少的视图耦合,例如,如果要更改视图显示信息的方式,则可以修改一个窗体,而不必修改另一个窗体,该窗体依赖于其控件在外部可见,正确命名,甚至根本不存在。

此视图控制器可以

作为构造函数参数传递给视图,或者如果适用,可以将其实现为系统范围的单一实例(因为在这种情况下,应用程序上下文的视图控制器不太可能超过 1 个(。

示例界面可能如下所示;

interface IViewController<T>
    where T : Form
{ 
    void ShowForm();
    void ShowFormModal();
}

您可以开始为不同的场景创建专门的视图控制器;

public IEmployeeViewController : IViewController<EmployeeForm>
{
    void ShowForm(string intemppk);
}

这确实是关于架构的一个非常基本的建议,它比我在一篇文章中描述的要复杂得多,但它可能会让你走上正确的轨道。