【问题标题】:Access to creator object访问创建者对象
【发布时间】:2009-05-11 13:08:25
【问题描述】:

我有一个简单的 C# 窗口应用程序,有 3 个表单。 第一个窗体是主窗体(它的名字是 FrmMain),第二个是 FrmData,第三个是 FrmShow。 在主窗体 (FrmMain) 中,我从第二种窗体 (FrmData) 创建了一个实例并显示它:

    public partial class FrmMain : Form
    {
        public Form FrmModifyData; //for FrmData
        int PersonCode;
        public FrmMain()
        {
            InitializeComponent();
        }

        private void btnShowDataForm_Click(object sender, EventArgs e)
        {
            FrmModifyData= new FrmData();  
            FrmModifyData.ShowDialog();

        }
    }

但我无法从 FrmModifyData 访问像 PersonCode 这样的 FrmMain 字段。 如何访问创建者对象的字段?

注意:我是初学者。

谢谢。

【问题讨论】:

    标签: c# forms object


    【解决方案1】:

    您需要向 FrmModifyData 类添加一个属性以获取 FrmMain 类的实例。然后你可以这样做:

    FrmModifyData = new FrmData();
    FrmModifyData.ParentData = this;
    FrmModifyData.ShowDialog();
    

    然后在 FrmModifyData 中,您将可以访问 FrmMain 的公共成员。显然,这是一种快速而肮脏的方式,而且可重用性不强,所以我建议向 FrmModifyData 添加更明确的属性,只包含您需要使用的数据。

    【讨论】:

    • 我认为实际上有一些设计模式可以做到这一点。父引用可能应该是子构造函数的参数,这样调用它:“new FrmData(this);”
    • 可能有,但就封装而言,更好的路线,IMO,是只提供控件需要的数据。控件很可能不需要访问父框架中的每个公共字段/方法。如果子框架需要在父框架上执行方法,那么这些方法可能应该在自定义事件中。
    【解决方案2】:

    如果你想访问 PersonCode 字段,你应该将它声明为 public。没有可见性修饰符将其设为私有,因此无法从其他情况下访问。

    【讨论】:

      【解决方案3】:

      我会把它做成这样的。 通过这种方式,您可以以其他形式使用 FrmModifyData。

      我知道这是一篇旧帖子,但是是的,你确实读过它:)

      public partial class FrmMain : Form
      {
          // public Form FrmModifyData; <-- do not declare it in your FrmMain 
          // (is't a modal dialog, so you won't get more instances)
      
          public int PersonCode {get; set;}
      
          public FrmMain()
          {
              InitializeComponent();
          }
      
          private void btnShowDataForm_Click(object sender, EventArgs e)
          {
              FrmData FrmModifyData = new FrmData();
              FrmModifyData.PersonCode = this.PersonCode;
              DialogResult result = FrmModifyData.ShowDialog();
              if(result == DialogResult.Ok)
              {
                  // do something with the result
                  this.PersonCode = FrmModifyData.PersonCode;
      
      
              }
      
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2016-11-12
        • 2018-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多