2015-01-05 1 views
0

Существует две формы, каждая из которых имеет текстовое поле. мой вопросКак получить доступ к текстовому поле в форме из другой формы

как получить доступ к текстовому полю на форме 1 по форме 2

и

как получить доступ к текстовому полю на форме 2 по форме 1?

Я использовал

Form1 ths; 
public Form2(Form1 my_form_1) 
{ 
    InitializeComponent(); 
    ths = my_form_1; 
} 

, но я не могу получить доступ к Form2 из Form1 !!!

TQ

+0

вы должны сделать модификатор доступа текстового поля для общественности, чтобы получить доступ к нему с другого classess – dotctor

+0

Вы можете передать 'Form2' в 'Form1' через свойство. –

+0

В свойстве текстового поля (или любого элемента управления) установите параметр «Модификаторы» на «Публичный». – dotctor

ответ

2

Вместо того, чтобы получить доступ к TextBox непосредственно, вы могли бы поделиться ViewModel, который предлагает свойства, необходимые для обеих форм (или любые другие элементы управления впоследствии)

Для этого, вы можете создать свой собственный ViewModel используя реализацию INotifyPropertyChanged, которая уведомляет слушателей о том, что свойство изменилось. Примером такого класса будет следующим

using System.ComponentModel; 

namespace SimpleViewModel 
{ 
    public class ViewModel : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     protected void RaisePropertyChanged(string propertyName) 
     { 
      var local = PropertyChanged; 
      if (local != null) 
      { 
       local.Invoke(this, new PropertyChangedEventArgs(propertyName)); 
      } 
     } 

     protected string result; 
     public string Result 
     { 
      get 
      { 
       return result; 
      } 
      set 
      { 
       if (string.Equals(result, value)) 
       { 
        return; 
       } 
       result = value; 
       RaisePropertyChanged("Result"); 
      } 
     } 
    } 
} 

Когда это свойство Результат изменится, класс будет сообщать о любых слушателей, зарегистрированных на событие PropertyChanged класса. Классы, которые прислушиваются к этим изменениям может выбрать, как обрабатывать или игнорировать это изменить (например, на основе PropertyName), как, например, в Form2 (я назвал его ResultForm)

using System; 
using System.ComponentModel; 
using System.Windows.Forms; 

namespace SimpleViewModel 
{ 
    public partial class ResultForm : Form 
    { 
     protected ViewModel viewModel; 
     public ViewModel ViewModel 
     { 
      get 
      { 
       return viewModel; 
      } 
      set 
      { 
       if (object.Equals(ViewModel, value)) 
       { 
        return; 
       } 
       if (ViewModel != null) 
       { 
        viewModel.PropertyChanged -= OnViewModelChanged; 
       } 
       viewModel = value; 
       if (ViewModel != null) 
       { 
        viewModel.PropertyChanged += OnViewModelChanged; 
       } 
      } 
     } 

     protected virtual void OnViewModelChanged(object sender, PropertyChangedEventArgs e) 
     { 
      var vm = sender as ViewModel; 
      if (vm == null) 
      { 
       return; 
      } 
      if (e.PropertyName == "Result") 
      { 
       lblResult.Text = vm.Result; 
      } 
     } 

     public ResultForm() 
     { 
      InitializeComponent(); 
     } 

     public ResultForm(ViewModel viewModel) 
     { 
      InitializeComponent(); 
      ViewModel = viewModel; 
     } 

     protected override void OnClosed(EventArgs e) 
     { 
      ViewModel = null; 
      base.OnClosed(e); 
     } 
    } 
} 

Здесь мы регистрируем на событие PropertyChanged, когда Свойство ViewModel изменяется (или задается с помощью конструктора). Когда мы получаем событие с измененным свойством, мы проверяем, изменилось ли это свойство «Результат», и если да, обновите наш lblResult соответственно (может быть ваш TextBox)

В форме1 мы могли бы создать ViewModel, и это ViewModel затем присваивается ResultForm, для тестового ввода, я добавил его в событие Form_Load, хотя важная часть здесь просто заключается в том, что ViewModel одинакова для обеих форм (это может быть одноэлементный класс, ... в зависимости от от потребности)

using System; 
using System.Windows.Forms; 

namespace SimpleViewModel 
{ 
    public partial class Form1 : Form 
    { 
     protected ViewModel MyResultViewModel = new ViewModel(); 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      ResultForm form = new ResultForm(MyResultViewModel); 
      form.Show(); 
      MyResultViewModel.Result = "42"; 
     } 
    } 
} 

установив свойство MyResultViewModel.Result, изменения отправляются в ResultForm и мы видим 42 в ярлыке

+0

Спасибо, я пробовал это;) – Sina

+0

@SinaGilassi это соответствовало вашим потребностям? – Icepickle

+0

Большое спасибо, это работает! – Sina

0

Когда вы создаете экземпляр Form2 в Form1 можно просто

public void yourMethod() 
{ 
    Form2 form = new Form2(this); 
    form.Show(); 
    form.textbox.Text = "xy"; 
} 
+0

то я могу изменить значение в любое время? – Sina

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