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

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为两个窗体(或以后的任何其他控件)提供所需的属性,而不是直接访问文本框 为

有两个表单,每个表单都有一个文本框。我的问题是

如何通过表单2访问表单1上的文本框

如何通过表格1访问表格2上的文本框

我曾经

 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";
        }
    }
}