如何从其他窗体访问窗体中的文本框

本文关键字:窗体 文本 访问 其他 | 更新日期: 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";
}