2009-05-11 17 views
0

У меня есть простое приложение для Windows в C# с тремя формами. Первая форма - основная форма (ее название 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 в FrmMain поля как PersonCode. Как получить доступ к полю объекта создателя?

Примечание: Я новичок.

спасибо.

ответ

3

Вам нужно будет добавить свойство к вашему классу FrmModifyData, чтобы взять экземпляр класса FrmMain. Тогда вы можете сделать это:

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

Тогда внутри FrmModifyData вы бы иметь доступ к публичным членам FrmMain. Очевидно, что это довольно быстро и грязно и не очень многократно используется, поэтому я бы предложил добавить более явные свойства в FrmModifyData только с данными, которые вам нужно использовать.

+1

Я думаю, что есть какой-то шаблон дизайна, чтобы сделать это, на самом деле. Родительская ссылка, вероятно, должна быть параметром дочернего конструктора, называя ее следующим образом: «new FrmData (this);» – Philippe

+0

может быть, но с точки зрения инкапсуляции лучший маршрут, IMO, должен предоставлять только данные, необходимые для управления. Управление, скорее всего, не нуждается в доступе к каждому общедоступному полю/методу в родительском фрейме. Если дочерний кадр должен выполнять методы в родительском фрейме, то они, вероятно, должны быть внутри пользовательских событий. –

0

Если вы хотите получить доступ к полю PersonCode, вы должны объявить его общедоступным. Никакой модификатор видимости не сделает его закрытым, поэтому он не будет доступен из других кассет.

0

Я бы сделал это примерно так. Таким образом, вы можете использовать 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; 


     } 

    } 
} 
Смежные вопросы