【问题标题】:Call ComboBox from another form从另一个窗体调用 ComboBox
【发布时间】:2014-02-20 05:19:59
【问题描述】:

我有 2 个表单 - Form1 和 Form2,Form1 有 ComboBox,Form2 属性有 FormBorderStyle 作为 FixedToolWindow。我需要从 Form2 调用 ComboBox,我该怎么做?

【问题讨论】:

  • 究竟想做什么? “1.您想在按钮单击时从现有表单中调用另一个表单吗?2.通过从组合框中选择值来调用另一个表单?3.从当前表单访问另一个表单的组合框?”
  • 不,你没有。您不能从任何 ComboBox 调用任何内容,因为 Microsoft 为 ComboBox 类编写了代码并且您无法更改它。你的意思是当Form1中ComboBox中的选择发生变化时需要显示Form2吗?如果是这样,那么您只需使用相同的代码,但在 ComboBox 的 SelectedIndexChanged 或 SelectionChangeCommitted 事件处理程序中,而不是在 Button 的 Click 事件处理程序中。不管怎样,代码都是 Form1 的一部分。如果这不是你的意思,那么请提供一个完整而清晰的解释你想要什么
  • 好吧。但是如何将选定的数据从 Form2 发送到 Form1?
  • “但是如何将选定的数据从 Form2 发送到 Form1?”:您不会从 Form2 发送任何内容到 Form1。 Form1 从 Form2 中提取数据。在下面的示例中,这正是 SelectedValue 属性的用途。 Form2 只是将数据提供给任何需要它的人。这取决于任何想要它的人,在这种情况下是 Form1,来获得它。该事件是新数据可用的通知,因此 Form1 会去获取新数据。

标签: c# .net winforms


【解决方案1】:

我看到问题已经改写,意思也发生了很大变化。

简单的事实是,Form2 甚至不应该知道 ComboBox 的存在,甚至 Form1 的存在。执行此操作的正确方法是让 Form2 引发事件并让 Form1 处理该事件。当需要发生某些事情时,Form2 会引发事件,然后 Form1 会访问它自己的 ComboBox。

Check this out。第 3 部分解释了应该如何完成。

这是一个相对人为的例子:

表格1:

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private Form2 form2Instance;

        private void button1_Click(object sender, EventArgs e)
        {
            // Check whether there is already a Form2 instance open.
            if (this.form2Instance == null || this.form2Instance.IsDisposed)
            {
                // Create a new Form2 instance and handle the appropriate event.
                this.form2Instance = new Form2();
                this.form2Instance.SelectedValueChanged += form2Instance_SelectedValueChanged;
            }

            // Make sure the Form2 instance is displayed and active.
            this.form2Instance.Show();
            this.form2Instance.Activate();
        }

        private void form2Instance_SelectedValueChanged(object sender, EventArgs e)
        {
            // Update the ComboBox based on the selection in Form2.
            this.comboBox1.SelectedIndex = this.form2Instance.SelectedValue;
        }
    }
}

表格2:

using System;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Gets the value selected in the NumericUpDown as an int.
        /// </summary>
        public int SelectedValue { get { return Convert.ToInt32(this.numericUpDown1.Value); } }

        /// <summary>
        /// Raised when the value in the NumericUpDown changes.
        /// </summary>
        public event EventHandler SelectedValueChanged;

        private void numericUpDown1_ValueChanged(object sender, EventArgs e)
        {
            if (this.SelectedValueChanged != null)
            {
                // Notify any listeners that the selection has changed.
                this.SelectedValueChanged(this, EventArgs.Empty);
            }
        }
    }
}

如您所见,Form2 根本没有引用 Form1,因此不需要知道或关心 Form1 是否存在。

【讨论】:

  • SelectedValueChanged 属性在哪里?
  • “SelectedValueChanged 属性在哪里?”:嗯,我在该属性上发表评论以解释它的作用。
  • “它显示一个错误”:如果我有办法知道那个错误是什么。我自己测试了该代码并且它有效。我猜该错误与未声明的button1comboBox1numericUpDown1 有关。猜猜看:您必须自己将控件添加到表单中。我不能为你神奇地做到这一点。您还必须连接适当的事件,即 Button.Click 和 NumericUpDown.ValueChanged。
  • 我已经给你一个链接,提供你需要的所有信息,我已经写了一个额外的例子。我不会再这样做了。示例的全部意义在于举例说明,而不是让您复制和粘贴,让您的项目工作无需额外的努力或思考。
  • 谢谢!请在我的这个测试项目 yadi.sk/d/LNFCUOxxJHk4D 上显示一个示例。我不能这样。我想知道如何在 Form1 和 Form2 之间发送数据,反之亦然,在 form2 和 Form1 之间。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-08-10
  • 2015-09-13
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多