如何从其他表单访问表单中的文本框

时间:2015-01-05 00:16:53

标签: c#

有两种形式,每种形式都有一个文本框。我的问题是

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

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

我用过

 Form1 ths;
 public Form2(Form1 my_form_1)
 {
     InitializeComponent();
     ths = my_form_1;
 }

但是我无法从form1访问form2 !!!

TQ

2 个答案:

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