表格沟通不正确

时间:2015-04-03 11:20:41

标签: c# forms communication

我一直在尝试制作多种形式的程序,但我一次又一次遇到同样的问题:

  1. Form2(或者你称之为)将已设置变量视为 null
  2. Form2在Form2更改Form1
  3. 中的变量时不接受

    最近一直很烦人,我决定在这里问一下,我可能(或可能不会)做错了什么。这是我的快速再现 - 一个程序,您可以使用另一种形式设置给定值:

    valueForm

    public partial class valueForm : Form
    {
        public int value;
        private changeValueForm change;
        public valueForm()
        {
            InitializeComponent();
        }
    
        private void Form1_Load(object sender, EventArgs e)
        {
            value = 2;
            valueLabel.Text = value.ToString();
            change = new changeValueForm();
        }
    
        private void change_Click(object sender, EventArgs e)
        {
            change.Show();
        }
    
        private void updatin_Tick(object sender, EventArgs e)
        {
            valueLabel.Text = change.thisValue.ToString();
        }
    }
    

    changeValueForm

    public partial class changeValueForm : Form
    {
        private valueForm valueForm;
        public int thisValue;
        private string[] digits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
        public changeValueForm()
        {
            InitializeComponent();
        }
    
        private void changeValueForm_Load(object sender, EventArgs e)
        {
            valueForm = new valueForm();
            thisValue = valueForm.value;
            valueBox.Text = thisValue.ToString();
        }
    
        private void closeButton_Click(object sender, EventArgs e)
        {
            if (digits.Contains(valueBox.Text.ToString()))
            {
                thisValue = Int32.Parse(valueBox.Text);
                valueForm.value = thisValue;
            }
        }
    }
    

    所以,总结一下,这段代码出了什么问题?

    PS How to pass values between forms in c# windows application?可能会解决1.问题,但valueForm仍然不接受changeValueForm中所做的更改 - 它只是保持原样是

2 个答案:

答案 0 :(得分:0)

而不是在这里创建valueForm的新实例:

private void changeValueForm_Load(object sender, EventArgs e)
{
    valueForm = new valueForm();

您应该将changeValueForm实例引用传递给您现有的valueForm并使用它。

例如,您可以在创建changeValueForm时完成此操作,例如change = new changeValueForm(this);

在这种情况下,您还需要将changeValueForm构造函数更改为

public changeValueForm(valueForm f)
{
    InitializeComponent();

    valueForm = f;
}

从您发布的代码中还不清楚 - 何时调用updatin_Tick方法并且应该调用它?我可以从方法名称猜测它 - 它应该是一些计时器 - 但是你的代码中没有声明任何计时器。

答案 1 :(得分:0)

这是一种常见的情况。在changeValueForm中,您可以创建valueForm的新实例。这个新实例与初始形式没有任何共同之处(与同一类相同)。这是一种完全不同的形式。因此,当您为changeValueForm内创建的实例设置属性时,您将设置不可见的表单属性。 (只是尝试在该实例上调用Show()。)

解决问题的最简单方法是将初始valueForm的实例传递给代码创建的changeValueForm。 通常这是在构造函数中完成的,但也可以使用valueChangeForm类的公共自定义属性传递。

使用构造函数

public partial class changeValueForm : Form
{
    private valueForm valueForm;
    ....

    public changeValueForm(valueForm currentInstance)
    {
        InitializeComponent();
        valueForm = currentInstance;
    }

当然,当你构建你的changeValueForm时,你可以调用

public partial class valueForm : Form
{
    public int value;
    private changeValueForm change;
    public valueForm()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        value = 2;
        valueLabel.Text = value.ToString();

        // pass this instance to the changeValueForm
        change = new changeValueForm(this);
    }

使用财产

public partial class changeValueForm : Form
{
    private valueForm valueForm;

    public changeValueForm ClientCaller 
    { get { return valueForm}; 
      set { valueForm = value};
    }....


public partial class valueForm : Form
{
    ...
    private void Form1_Load(object sender, EventArgs e)
    {
        ....
        change = new changeValueForm();
        change.ClientCaller = this;
    }