2012-05-20 75 views
0

在我的应用程序中,我有一个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一个TextBox的Text属性EmployeeTransferForm,如:

public partial class EmpLoctnChangeForm : Form 
{ 
    public EmpLoctnChangeForm() 
    { 
     InitializeComponent(); 
    } 

    private void EmpLoctnChangeForm_Load(object sender, EventArgs e) 
    { 
     intemppk = humanresourceform.txtpk.text; 
    } 
} 

期待所有一些很好的建议。
在此先感谢。

+0

您可以使用其中的一种:1.将HumanResourceForm控制值传递给EmployeeTransferForm构造函数。 2.在EmployeeTransferForm中创建属性并在显示表单之前设置它们 – Reniuz

回答

0

我建议你在EmployeeTransferForm类中定义一些事件(form where你想获得属性的值),并在Humanresources(你想要访问属性的表单)中实现它们。我不建议在面向对象的体系结构中传递整个对象。

因此,该代码形成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 
    //... 
} 
0

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

public static HumanResourceForm Instance; 

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

Instance = this; 

然后在您的EmpLoctnChangeForm:

intemppk = HumanResourceForm.Instance.txtpk.Test; 
0

也许看看如何实现某种 '视图控制器',这负责这些'交叉'通信和表单创建。这种方法将更好地封装创建表单(视图)和在它们之间共享数据的过程。它可以减少视图的耦合,例如如果你想改变视图显示信息的方式,你可以修改一个表单而不必修改另一个表单,而这个表单依赖于外部可见的控件,并且命名正确,甚至是正确命名完全存在。

此视图控制器可以作为构造函数参数传递给视图,或者如果合适,您可以将其作为系统范围的单例实现(因为在此实例中,应用程序上下文不可能有多于1个视图控制器) 。

示例界面可能看起来像;

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

而且你可以开始为不同的场景创建专门的ViewController;

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

这确实是一个非常基本的建议,作为一个建筑,这是更复杂的比我可以在一个单一的岗位描述,但它可以设置你在正确的轨道上。