有两种形式,每种形式都有一个文本框。我的问题是
如何通过表单2访问表单1上的文本框
和
如何通过表单1访问表单2上的文本框?
我用过
Form1 ths;
public Form2(Form1 my_form_1)
{
InitializeComponent();
ths = my_form_1;
}
但是我无法从form1访问form2 !!!
TQ
答案 0 :(得分:2)
您可以共享ViewModel,而不是直接访问TextBox,ViewModel提供两个表单(或之后的任何其他控件)所需的属性
为此,您可以使用INotifyPropertyChanged实现创建自己的ViewModel,该实现通知任何侦听器属性已更改。这样一个类的一个例子是以下
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");
}
}
}
}
当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);
}
}
}
这里我们在ViewModel属性被更改(或使用构造函数设置)时注册到PropertyChanged事件。当我们获得属性更改事件时,我们检查它是否确实是更改的“Result”属性,如果是,则相应地更新我们的lblResult(可能是您的TextBox)
在form1中我们可以创建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,我们在Label中看到42
答案 1 :(得分:0)
当你在Form1中创建Form2的实例时,你可以
public void yourMethod()
{
Form2 form = new Form2(this);
form.Show();
form.textbox.Text = "xy";
}