在我的应用程序中,我有一个mainform,它是所有其他形式的MdiParent。在登录时,默认情况下会打开此表单,我们将以这种形式从menustrip导航到其他表单:
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。
我还想在HumanResourceForm
中获取EmployeeTransferForm
的TextBox的Text属性,如:
public partial class EmpLoctnChangeForm : Form
{
public EmpLoctnChangeForm( )
{
InitializeComponent();
}
private void EmpLoctnChangeForm_Load(object sender, EventArgs e)
{
intemppk = humanresourceform.txtpk.text;
}
}
期待所有人提出一些好的建议 提前谢谢。
答案 0 :(得分:0)
您可以创建一个公共静态变量来从其他地方访问它:
public static HumanResourceForm Instance;
然后在构造函数中设置值:
Instance = this;
然后在你的EmpLoctnChangeForm:
intemppk = HumanResourceForm.Instance.txtpk.Test;
答案 1 :(得分:0)
我建议您在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
//...
}
答案 2 :(得分:0)
也许看看实现某种'ViewController',它负责这些'跨视图'通信和表单创建。这种方法可以更好地封装创建表单(视图)和在它们之间共享数据的过程。它可以提供较少的视图耦合,例如,如果您想要更改视图显示信息的方式,您可以修改一个表单而无需修改另一个表单,该表单依赖于外部可见的控件,并且命名正确,甚至完全存在。
此视图控制器可以作为构造函数参数传递给视图,或者如果合适,您可以将其实现为系统范围的单例(因为在此实例中,应用程序上下文不可能有多于1个视图控制器)。
示例界面可能看起来像;
interface IViewController<T>
where T : Form
{
void ShowForm();
void ShowFormModal();
}
您可以开始为不同的场景创建专门的ViewControllers;
public IEmployeeViewController : IViewController<EmployeeForm>
{
void ShowForm(string intemppk);
}
对于一个体系结构来说,这是一个非常基本的建议,它比我在一篇文章中描述的更复杂,但它可能会让你走上正轨。