从父窗体获取值
本文关键字:获取 窗体 | 更新日期: 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);
}
这确实是关于架构的一个非常基本的建议,它比我在一篇文章中描述的要复杂得多,但它可能会让你走上正确的轨道。