2012-05-20 3 views
0

В моем приложении у меня есть основная форма, которая является MdiParent всех других форм. При входе в системе по умолчанию открывается эта форма и от MenuStrip в этой форме мы перемещаемся к другим формам, как это:Получить значение из parentform

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. Также пользователю не разрешается закрывать HumanResourceForm, когда EmployeeTransferForm открыт или активен.

Я также хочу, чтобы получить текст свойство TextBox из HumanResourceForm в EmployeeTransferForm как:

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

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

Ожидая некоторый хороший совет от всех.
Спасибо заранее.

+0

Вы можете использовать один из следующих: 1. Передайте управляющие значения HumanResourceForm конструктору EmployeeTransferForm. 2. Создайте свойства в EmployeeTransferForm и установите их перед отображением формы – Reniuz

ответ

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 
    //... 
} 
0

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

public static HumanResourceForm Instance; 

Затем установите значение в конструкторе:

Instance = this; 

Затем в EmpLoctnChangeForm:

intemppk = HumanResourceForm.Instance.txtpk.Test; 
0

Возможно взглянуть на реализацию какой-то 'ViewController', который отвечает за эти «кросс-просмотр» сообщений и создание форм. Такой подход лучше инкапсулирует процесс создания форм (представлений) и обмена данными между ними. Это обеспечит меньшую связь взглядов, например, если вы хотите изменить способ отображения информации о просмотре, вы можете изменить одну форму без необходимости изменять другую форму, которая зависит от того, какие элементы управления на ней внешне видимы и называются правильно, или даже существующих вообще.

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

Пример интерфейса может выглядеть;

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

И вы можете приступить к созданию специализированных ViewControllers для разных сценариев;

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

Это действительно очень простое предложение, как к архитектуре, которая является более сложной, чем я могу описать в одном посте, но это могло бы установить Вас на правильном пути.

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