【问题标题】:Forms not communicating correctly表格无法正确沟通
【发布时间】:2015-04-03 20:46:29
【问题描述】:

我已经尝试制作多格式程序有一段时间了,但我一次又一次地遇到同样的 2 个问题:

  1. Form2(或者你怎么称呼它)将已经设置变量视为null
  2. Form1 不接受,当 Form2 从 Form1 更改变量时

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

值形式

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();
    }
}

更改值表单

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

那么,总结一下,这段代码有什么问题?

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

【问题讨论】:

标签: c# forms communication


【解决方案1】:

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

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

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

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

在这种情况下你还需要和changeValueForm构造函数来

public changeValueForm(valueForm f)
{
    InitializeComponent();

    valueForm = f;
}

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

【讨论】:

  • 在控件构造函数中放入参数并非易事:stackoverflow.com/questions/1784303/… 尤其是 Visual Studio Windows 窗体设计器不会处理它。
  • @Orace 您发布了对 5 年以上帖子的引用。 Visual Studio 的现代版本(例如 VS2012)完美地处理了当你有参数化构造函数并且没有无参数构造函数的情况。
  • 很高兴知道。我也使用 VS2010。而且它还没有死:support.microsoft.com/fr-fr/lifecycle/search/…
【解决方案2】:

这是一种常见的情况。在您的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;
    }

【讨论】:

  • 在控件构造函数中放入参数并非易事:stackoverflow.com/questions/1784303/… 尤其是 Visual Studio Windows 窗体设计器不会处理它。
  • 向表单构造函数传递参数是没有问题的。链接的文章与 UserControls 相关,需要在设计器界面中使用/放置无参数构造函数
猜你喜欢
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多