【问题标题】:Get ComboBox selected value form Form1 to another Form2将 ComboBox 选定值从 Form1 获取到另一个 Form2
【发布时间】:2014-11-24 15:27:12
【问题描述】:

我有一个 C# windows 应用程序,它有两个窗体 Form1 和 Form2。 Form1 上有一个组合框,Form2 上有一个文本框。

我想把Form1.ComboBox1中选中的值放到Form2.TextBox1中。

我正在尝试这个:

        Form1 Form1Object = new  Form1();
        string fff = Form1Object.ComboBox1.SelectedItem.ToString(); //not working
        TextBox1.Text = fff;

问题是,当我运行此 Form1 时,它会重新初始化,我不希望这样。 (当应用程序启动时,我有一个启动画面,所以当我运行我的代码时,启动画面会重新开始。

有没有办法在不重新启动第一个表单的情况下读取 ComboBox1 的值? 如果我直接尝试它不起作用,它会将 Form1 视为 cals 而不是 object。

    Form1.ComboBox1.SelectedItem.ToString(); //does not work

我还尝试在打开第二个表单时将值添加到文本框:

        Form2 form2 = new Form2();
        form2.TextBox1.Text = ComboBox1.SelectedValue.ToString();
        form2.Show();  

这给了我以下错误:“对象引用未设置为对象的瞬间。”

编辑: 它使用以下代码工作:

        Form2 form2 = new Form2();
        form2.TextBox1.Text = ComboBox1.Text;
        form2.Show();

现在我的问题仍然存在:如果我在 Form2 中,我还能从 form1 中获取值吗?如果没有,那没关系。我会将其发布为解决方案。

【问题讨论】:

  • 只要你在 Form1-class 中,你就可以使用当前实例的 this 引用。因此,您可以重复使用相同的实例。
  • 您可以使用事件。 Here is an example。但在您的情况下,在示例中使用组合框选定项目更改事件而不是 textBox1_TextChanged。
  • "对象引用未设置为对象的瞬间。"表示您的 ComboBox 中的 SelectedValue 为空。抛出此异常时,调试并检查组合框的 SelectedValue、SelectedItem 和 SelectedIndex 属性中的内容。
  • 看起来它可以使用 Form1 中的 ComboBox1.Text,但不能使用 SelectedValue。
  • 真的不是混蛋,而是.....I have a splash screen that runt when the application starts。那条线让我很开心。

标签: c# winforms combobox


【解决方案1】:

虽然这不是最合适的答案,但它是解决问题的一种方法。

表格1

添加获取值的方法

  public string TransmitSelectedValue()
  {
    return ComboBox1.SelectedItem.ToString();
  }

Form2

 var myvalue = ((Form1)ParentForm.Controls.Find(Form1Name,true)).TransmitSelectedValue();

【讨论】:

  • 它不工作。 Form1Name 在我的应用程序中是 Form1,当我在您的代码中将 Form1Name 替换为 Form1 时出现错误。
  • 您的Form1实例在创建时的名称是“Form1”?
  • 是的。我保持不变。它是应用程序的默认形式。应用启动时启动的那个。
  • 你得到的错误是什么。告诉我你在哪里实例化你的 Form1 以及是什么创建了你的表单 1? Form1 和 Form1 是否具有相同的顶级父级?...或者 Form1 是否创建 Form 2。
  • 我在开始时通过向项目添加表单来创建两者。
【解决方案2】:

这类问题已经被问过很多次,而且有不同的版本。

我建议查看我过去发布的以下一些内容...

This example 显示了两种形式,其中第二种形式作为参数传递给第一种形式的实例。然后,从第一个公开的公共方法中,第二个可以调用它们来获取值。您可以自行决定是否要允许从备用源进行设置,或者只允许 get 方法...可以作为属性 public get 完成;受保护的集合;

This stackoverflow search 将显示几个指向我过去发布的帖子的链接,不同形式之间的版本略有不同。

评论反馈

必须在您的第一个表单中执行某些操作才能调用第二个表单。它是来自单击按钮,还是基于正在更改的实际组合框选择。不管是什么,我提供的第一个示例应该是您需要的。您没有让第二种形式调用第一种形式。

如果没有第一个示例的完整复制\粘贴,您真正需要做的就是在表单 2 构造函数中将您的文本设置为从第一个示例中提取...

public Form2(Form1 viaParameters) : this()
{
    this.textBox1.Text = viaParameters.Combobox1.SelectedItem;
}

但是,我不知道您的项目是如何定义的。字典、列表、数组等等。所以您可能需要进行类型转换才能通过

获取所选项目
if( viaParameters.Combobox1.SelectedIndex > -1 )
  this.textBox1.Text = viaParameters.Combobox1.Items[ viaParameters.Combobox1.SelectedIndex ].WhateverStringValue;

这样从form 1开始的form 2就可以直接获取值了。

如果您通过属性或方法从第一个表单公开方法,则您的文本值可能很简单

this.textBox1.Text = viaParameters.YourForm1sMethodToGetStringFromCombobox();

【讨论】:

  • 您好,我搜索了论坛并找到了示例,但在所有示例中,第二个表单都被初始化为 frm2,并且用户从表单 1 访问了 frm2.object。我需要的是相反的方式。我无法将 Form1 初始化为 frm1,然后从 Form1 开始使用 frm1 作为对象,或者在应用程序运行时首次打开。
  • @Danut,请查看对我的答案的修订以进行澄清...此外,尝试执行整个第一个示例以查看事情是如何工作的,然后根据您的场景通过组合框示例进行更改。
【解决方案3】:

我不确定问题出在哪里

在启动/打开 form2 时

喜欢

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

您将 form1 引用为“所有者”

在 form2 上,您可以将其放在您想要的任何事件或按钮或其他任何东西上

        Form1 f1 = Owner as Form1;
        textBox1.Text = f1.comboBox1.SelectedItem.ToString();

转换为 C# ...

【讨论】:

    猜你喜欢
    • 2012-08-10
    • 2015-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    相关资源
    最近更新 更多