【问题标题】:Get value from parentform从父窗体中获取值
【发布时间】:2012-05-21 13:24:47
【问题描述】:

在我的应用程序中,我有一个主窗体,它是所有其他窗体的 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。

我还想在EmployeeTransferForm 中获取HumanResourceForm 的TextBox 的Text 属性,例如:

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

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

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

【问题讨论】:

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

标签: c# winforms


【解决方案1】:

我建议您在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】:

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

    public static HumanResourceForm Instance;
    

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

    Instance = this;
    

    然后在您的 EmpLoctnChangeForm 中:

    intemppk = HumanResourceForm.Instance.txtpk.Test;
    

    【讨论】:

      【解决方案3】:

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

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

      示例界面可能如下所示;

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

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-27
        • 1970-01-01
        • 2010-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-03
        相关资源
        最近更新 更多