2014-12-12 4 views
1

У меня есть следующий код (это отрывок, который я попытался включить всю важную информацию в нем)Как получить доступ к переменной из дочернего элемента управления, который добавлен в другой элемент управления?

public partial class MyTopScreen : Form 
{ 
    public bool _myVariable ; 
    public CommonForm _commonGridForm; 
    public MyTopScreen(bool first_param, string second_param) 
    {   
     CommonForm commonGridForm = new CommonForm(); 
     DataGridView dataGridView1 = commonGridForm.dataGridView1; 
     _commonAttributForm = commonAttributForm;   
     InitializeComponent(); 
     this.TabPage1.Controls.Add(dataGridView1); 
    } 
} 

, а затем, когда я нахожусь внутри CommonForm, который выглядит следующим образом:

public partial class CommonForm : Form   
{ 
    public CommonForm() 
    { 
     //My Question is how do I access the _myVariable from this point in the code ? 
     //this.parent  doesnot work or does not give me access to _myVaribale 
    } 
} 

Заранее благодарю за вашу высоко ценимую помощь.

+1

Передайте его в конструктор. –

ответ

3

Один из способов передать экземпляр MyTopScreen в конструктор другого класса, если это относится к нему. Храните его в поле.

public partial class CommonForm : Form 
{ 
    public CommonForm(MyTopScreen screen) 
    { 
     this.TopScreen = screen; 
    } 

    private MyTopScreen TopScreen{ get; set; } 
} 

Теперь вы можете получить доступ к этой переменной в CommonForm через TopScreen._myVariable.

Вы должны передать его в конструктор:

CommonForm commonGridForm = new CommonForm(this); 
3

Вы должны бросить родителя соответствующего типа:

MyTopScreen myParent = this.parent as MyTopScreen; 
if (myParent != null) 
{ 
    bool myVariableFromParent = myParent._myVariable; 
} 

Только будьте осторожны с литьем, потому что, если родитель другого управляющего, то вы получите нулевой ссылочный исключение при попытке доступа _myVariable. Кроме того, не пытайтесь использовать прямой листинг ((MyTopScreen)this.parent), потому что если родительский элемент - это другой элемент управления, вы получите исключение исключения.

+0

Я предлагаю прямой ролик в отличие от безопасного нажатия с ключевым словом 'as'. Потому что с ключевым словом 'as' вы предотвращаете' InvalidCastException', но если блок не будет отменен, что может вызвать более серьезную проблему.IMO, если вам что-то нужно, спросите его (инъекция зависимостей, возьмите зависимость в конструкторе) –

+0

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

+0

Спасибо за ответы и комментарии. Полезные головки. – user1298925

2

создать параметризованный конструктор (конструктор перегружать) из CommonForm класса и проход ваше значение bool.

public partial class MyTopScreen : Form 
{ 
    public bool _myVariable ; 
    public CommonForm _commonGridForm; 
    public MyTopScreen(bool first_param, string second_param) 
    {   
     CommonForm commonGridForm = new CommonForm(_myVariable); 
     DataGridView dataGridView1 = commonGridForm.dataGridView1; 
     _commonAttributForm = commonAttributForm;   
     InitializeComponent(); 
     this.TabPage1.Controls.Add(dataGridView1); 

    } 
} 

public partial class CommonForm : Form 
{ 
     public CommonForm(bool _myVariable) 
     { 
      //Here you access the variable 
     } 
} 
+0

Спасибо. Это будет работать, если мое значение переменной не меняется. Но в CommonForm значение переменной может быть изменено. Вот почему в моем случае мне нужно передать ссылку на родительский экран, а не на переменную. – user1298925

3

Причина this.Parent не работает, потому что вы никогда не ставили MyTopScreen в качестве родителя. Вы должны добавить commonGridForm.Parent = this в свой код. Затем вы можете позвонить ((MyTopScreen) this.Parent)._myVariable. Но это только для того, чтобы ваш текущий код работал; это определенно не лучший подход.

Одно из усовершенствований, о которых я хотел бы предложить, - не публиковать свои поля публично, а вместо этого использовать их в качестве полей поддержки, открытых через свойства (см. this).

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

public partial class MyTopScreen : Form 
{ 
    //keep your fields private. 

    private bool _myVariable; 
    private CommonForm _commonGridForm; 

    //expose fields through properties. 

    public bool MyVariable 
    { 
     get { return _myVariable; } 
    } 

    public CommonForm CommonGridForm 
    { 
     get { return _commonGridForm; } 
    } 

    public MyTopScreen(bool first_param, string second_param) 
    { 
     CommonForm commonGridForm = new CommonForm(this); 
     DataGridView dataGridView1 = commonGridForm.dataGridView1; 
     _commonAttributForm = commonAttributForm;   
     InitializeComponent(); 
     this.TabPage1.Controls.Add(dataGridView1); 

    } 
} 


public partial class CommonForm : Form 
{ 
    private MyTopScreen _parent; 

    //inject parent reference in child form's constructor. 

    public CommonForm(MyTopScreen withParent) 
    { 
     _parent = withParent; 
     //_parent.MyVariable <-- here's how you'd access your var. 
    } 
} 
+0

Благодарим за отзыв. У меня есть два одновременных ответа и, насколько мне известно, я верю, что другой ответ на первом месте?, Но большое спасибо за исчерпывающий ответ. – user1298925

1

Существует несколько способов сделать это. Если значение не изменится, вы можете передать его в конструктор CommonForm (рекомендуется):

public partial class CommonForm : Form 
{ 
    public CommonForm(bool myVariable) 
    { 
     // available 
    } 
} 

CommonForm commonGridForm = new CommonForm(_myVariable); 

Если это может измениться, вы можете передать экземпляр родительской формы в конструкторе:

public partial class CommonForm : Form 
{ 
    public CommonForm(MyTopScreen parent) 
    { 
     // available 
     parent._myVariable; 
    } 
} 

CommonForm commonGridForm = new CommonForm(this); 
+0

да в моем случае значение изменилось бы. благодаря – user1298925