C# 如何从其他窗体访问窗体中的文本框
有两个表单,每个表单都有一个文本框。我的问题是 如何通过表单2访问表单1上的文本框 及 如何通过表格1访问表格2上的文本框 我曾经C# 如何从其他窗体访问窗体中的文本框,c#,C#,有两个表单,每个表单都有一个文本框。我的问题是 如何通过表单2访问表单1上的文本框 及 如何通过表格1访问表格2上的文本框 我曾经 Form1 ths; public Form2(Form1 my_form_1) { InitializeComponent(); ths = my_form_1; } 但我无法从form1访问form2 TQ您可以共享一个ViewModel,该ViewModel为两个窗体(或以后的任何其他控件)提供所需的属性,而不是直接访问文本框 为
Form1 ths;
public Form2(Form1 my_form_1)
{
InitializeComponent();
ths = my_form_1;
}
但我无法从form1访问form2
TQ您可以共享一个ViewModel,该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");
}
}
}
}
当其结果属性发生更改时,该类将通知注册到该类的PropertyChanged事件的所有侦听器。然后,侦听这些更改的类可以选择如何处理或忽略这些更改(例如,基于PropertyName),如Form2中所述(我称之为ResultForm)
在这里,当ViewModel属性更改(或使用构造函数设置)时,我们注册到PropertyChanged事件。当我们得到属性更改事件时,我们会检查它是否确实是更改的“Result”属性,如果是,则相应地更新我们的lblResult(可能是您的文本框)
在form1中,我们可以创建ViewModel,然后将该ViewModel提供给ResultForm,为了测试用例,我将其添加到Form_Load事件中,尽管这里的重要部分只是ViewModel对于两种表单都是相同的(它可以是一个单例类,…取决于您的需要)
通过设置MyResultViewModel.Result属性,将更改发送到ResultForm,我们在标签中看到42,当您在Form1中创建Form2实例时,您可以
public方法()
{
Form2 form=新Form2(本);
form.Show();
form.textbox.Text=“xy”;
}
您应该将文本框访问修饰符设置为公共,以便从其他类访问它。您也可以通过属性将Form2
传递到Form1
。在文本框(或任何控件)的属性中,将“修饰符”选项设置为“公共”。在两个窗体之间共享viewmodel一旦可以访问文本框,您希望对其执行什么操作?然后,我可以随时更改该值?谢谢,我正在尝试;)@SinaGilassi适合你的需要吗?非常感谢,它很有效!我尝试了那个代码,但是从2开始我不能在form1中更改textbox1!!!它不是双向的如果您想要双向,您还应该在Form1的ViewModel上附加PropertyChanged的侦听器,并相应地进行更改!我不仅发布了很多代码,我还发布了很多关于代码在做什么以及如何为其他属性、其他侦听器复制其行为的解释
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);
}
}
}
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";
}
}
}