如何从其他窗体访问窗体中的文本框
本文关键字:窗体 文本 访问 其他 | 更新日期: 2023-09-27 18:36:05
有两种形式,每种形式都有一个文本框。 我的问题是
如何通过表单 2 访问表单 1 上的文本框
和
如何通过表单 2 访问表单 1 上的文本框?
我用了
Form1 ths;
public Form2(Form1 my_form_1)
{
InitializeComponent();
ths = my_form_1;
}
但我无法从表单 2 访问表单 1!!
TQ
您可以共享一个 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 事件。当我们得到属性更改事件时,我们检查它是否确实是"结果"属性发生了变化,如果是,则相应地更新我们的 lblResult(可能是您的文本框)
在 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,我们在标签中看到 42
当您在 Form1 中创建 Form2 的实例时,您可以只
public void yourMethod()
{
Form2 form = new Form2(this);
form.Show();
form.textbox.Text = "xy";
}