从parentform获取价值

时间:2012-05-20 18:09:37

标签: c# winforms

在我的应用程序中,我有一个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;
    }
}

期待所有人提出一些好的建议 提前谢谢。

3 个答案:

答案 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);
}

对于一个体系结构来说,这是一个非常基本的建议,它比我在一篇文章中描述的更复杂,但它可能会让你走上正轨。