Вместо того, чтобы получить доступ к 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 в ярлыке
вы должны сделать модификатор доступа текстового поля для общественности, чтобы получить доступ к нему с другого classess – dotctor
Вы можете передать 'Form2' в 'Form1' через свойство. –
В свойстве текстового поля (или любого элемента управления) установите параметр «Модификаторы» на «Публичный». – dotctor