【问题标题】:Communicating between two Forms in C# [duplicate]在 C# 中的两个表单之间进行通信 [重复]
【发布时间】:2015-01-09 06:48:05
【问题描述】:

我有以下几点: 我有一个有两种形式的 GUI。 Form2 通过一个按钮通过 Form1 打开。两种形式都有文本框,我希望它们相互通信(一种形式可以从另一种形式中获取文本框的条目)。我现在在 Form2 中所做的是:

    private Form1 m_form = null;

    public Form2(Form1 f)
    {
        InitializeComponent();

        m_form = f;
    }

对于文本框功能,例如:

    public String getLocation()
    {
        return LocationBox.Text;
    }

效果很好。所以 Form2 可以从 Form1 中读取条目。现在我想让 Form1 从 Form2 读取文本框条目并尝试了同样的事情(这可能是错误的):

    private Form2 m_form2 = null;

    public Form1(Form2 f2) 
    {
        InitializeComponent(); 
        m_form2 = f2;
    }

然后是一些功能,例如我发布的功能,但每次我想使用 Form2 中的 Form1 读取文本框时,我都会收到“null”和“NullReference”异常。哪里出错了?

编辑:好的,我解决了一部分。添加

        Form2 m_form2 = new Form2(this);
        m_form2.Show();

解决了 NullReferenceException 的问题。没有线 m_form2.Show()

它传递空字符串,但现在每次我点击一个按钮,form2 都会出现。

【问题讨论】:

  • 你已经形成了一个'循环引用'。现在是鸡蛋问题。哪一个会先来? Form1 需要 Form2 引用,而 Form2 需要 Form1 引用。
  • 如何避免这种情况?一种方法很好用,另一种方法不行
  • 好的,我想我宁愿把这个放在另一个问题中

标签: c# winforms textbox


【解决方案1】:

我认为问题在于您从不调用构造函数 public Form1(Form2 f2) 。当您从第一个打开 Form2 时,您必须将该实例保存在您的 Form1 实例中:

void createForm2() {
    Form2 frm2 = new Form2(this);
    this.m_form2 = frm2;
}

【讨论】:

  • 似乎没有任何改变。我需要更换一些东西吗?
  • @uzi42tmp 也许你应该展示你从Form1创建Form2的代码。
【解决方案2】:

在 Form1 中试试这个:

this.TextBoxName.Text = m_Form2.getLocation();

或在 Form2 中:

m_form.TextBoxName.Text = this.getLocation();

注意 在 Form1 中调用 form 2:

m_Form2 = new Form2(this);
//do anything with your code

【讨论】:

  • 不起作用。他对“this”有问题,甚至找不到文本框。
  • 你应该修改 TextBox is Public
  • 当你在 Form1 中编码时 - 这意味着 Form1,当你在 Form2 中编码时 - 这意味着 Form2
  • 他说 m_form 是一个字段,但被用作类型,并且 this.getLocation() 没有返回值。当我将 m_form2 = new Form2(this) 放入 null 异常消失但他现在传递空字符串。在 Form2 中编码确实有效,但在 Form1 中编码无效
【解决方案3】:

对于在两个表单之间发送值,您可以

1-> 发送第二种形式的构造函数中的值。您可以创建一个参数化构造函数并在将表单初始化为时发送值:

Form1 obj = new Form1(Object);

2->您可以在第二个表格中引用您的第一个表格。

第二种形式,

public Form1 objForm1;
and in First Form,

Form2 objForm2=new Form2();
Form2.objForm1=this;

然后你可以使用Form2的objForm1来引用Form1的文本框或任何控件。

假设您要将所有值从 Form1 发送到 Form2

在您的第二个表单中,您必须有一个类型为 Form1 的变量,该变量引用前一个表单。所以在第二种形式中,

public Form1 objForm1;
and then you need to send the current instance of the Form1 to Form2 as

Form2 objForm2=new Form2();
Form2.objForm1=this;

即您在 Form2 中创建的 objForm1 引用了 Form1 的这个实例。

现在在 Form2 中,您可以使用 Form1 的任何控件或变量作为,

Form1.TextBox1 或 Form1.Variable

【讨论】:

  • 似乎不起作用。他需要 Form2.objForm1 的对象引用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多