【问题标题】:Using comboBox from another form in c#在 C# 中使用来自另一个表单的组合框
【发布时间】:2013-08-18 09:36:26
【问题描述】:

我想使用 Form1 中的 comboBox1 并在表单 2 中单击按钮后将其显示在 MessageBox 中。在 Form2 中我使用了:

    MessageBox.Show(Form.comboBox1.SelectedItem.ToString());

我收到一条错误消息,提示由于保护级别,comboBox1 无法访问。有没有办法让它公开?我还尝试将 comboBox1.SelectedItem.ToString() 分配给 Form1 中的字符串变量,并在 Form2 的 MessageBox 中使用它,但它似乎也不起作用。有没有其他方法可以让它工作?

这是我的其余代码:

    public Form1()
    {
        InitializeComponent();

        for (int i = 1; i <= 30; i++)
        {
            string[] numbers= { i.ToString() };
            comboBox1.Items.AddRange(numbers);
        }

    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form2 Form = new Form2();
        Form.Show();
    }
}

表格2:

    public Form2()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Form1 Form = new Form1();
        MessageBox.Show(Form.comboBox1.SelectedItem.ToString()); //Here is my error
    }
}

}

【问题讨论】:

    标签: c# forms combobox


    【解决方案1】:

    一种方法是这样做:

    Form1 内部,您可以像这个新的Form2(this) 一样实例化Form2,即您正在传递Form1 本身,因此您应该能够在@987654326 中使用Form1 的任何公共变量/属性@。

    更可取的方法是将Form1selecteditem 存储在一些global scope 中,您可以从Form2 中访问它。

    【讨论】:

      【解决方案2】:

      您可以像这样使 ComboBox 成为表单的属性:

      public partial class Form1 : Form
      {
          public ComboBox Combo1 { get { return this.comboBox1; } }
         ...
      }
      

      然后它就可以工作了。但是,您将不得不稍微调整您的代码,因为您需要 1) 显示表单和 2) ComboBox 将不会立即选择任何内容,因此您将获得另一个异常,因此您可以强制选择。所有代码如下所示:

      private void button1_Click(object sender, EventArgs e)
      {
      
          Form1 Form = new Form1();
          Form.Show();
          Form.Combo1.SelectedIndex = 0;
          MessageBox.Show(Form.Combo1.SelectedItem.ToString()); //Here is my error
      }
      

      【讨论】:

      • 但是您再次从 Form2 显示 Form1,这可能真的很混乱。
      • 我不知道他想要完成什么,但这就是他所要求的......
      • Form.Combo1.SelectedIndex = 0;仅返回组合框的第一个值,而不是所选值。有没有办法解决这个问题?
      • @meau94 这只是一个例子。如果已经有选中项,则不需要设置组合框的 SelectedIndex。
      【解决方案3】:

      简单的答案:在设计器中,每个控件都有一个名为Modifiers 的属性,您可以在其中设置它是privatepublic 等。只需更改它,它就会在您的表单之外可见。

      现在,在您的 Form2 代码中,您正在创建一个 Form1,而不仅仅是访问之前创建 Form2 的实例。这将向用户显示第二个 Form1,我猜这不是您想要做的。 解决此问题的最天真的方法是为 Form2 提供一个公共属性,该属性将保存创建它的 Form1,并使用它来访问组合:

      public partial class Form2 : Form
      {
          public Form1 ParentForm {get; set;}
      
          public Form2()
          {
              InitializeComponent();
          }
      
          private void button1_Click(object sender, EventArgs e)
          {
              MessageBox.Show(this.ParentForm.comboBox1.SelectedItem.ToString());
          }
      }
      

      在表格 1 中:

      private void button1_Click(object sender, EventArgs e)
      {
          Form2 form = new Form2();
          form.ParentForm = this;
          form.Show();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-01
        • 1970-01-01
        • 2021-09-11
        • 2018-06-25
        • 1970-01-01
        • 2017-03-09
        • 1970-01-01
        相关资源
        最近更新 更多