【问题标题】:I need to pass a combobox to a class method using C#我需要使用 C# 将组合框传递给类方法
【发布时间】:2014-01-23 06:55:37
【问题描述】:

我有一个自定义类,它使用 WMI 处理我的串行 COM 端口的收集,它按预期工作。现在,我想将 WMI 查询值传递给我在不使用类时已经完成的组合框。但是,我正在尝试清理我的代码并将部分放入一个类中。我现在正试图通过传递组合框所在的 Form 对象,将组合框传递给位于单独的 .cs 文件中的类方法。我试过:public void getSerialPorts(Form f),但是当我按 f 时。我在 Visual Studio 创建的下拉列表中看不到我的组合框。我认为我的组合对象没有正确传递。有人可以举一个简单的例子来说明如何将表单控件对象传递给类方法以便以后操作它们吗?

代码段:
Form1.cs

        private void computerButton_Click(object sender, EventArgs e)
        {
            bsetup.getSerialPorts(this);
        }

setup.cs

    public void getSerialPorts(Form f)
    {

        try
        {
            string wmiresult;


            ManagementObjectSearcher searcher =
                new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE Caption like '%mbed% %Serial% %Port% %(COM%'");

            foreach (ManagementObject queryObj in searcher.Get())
            {
                wmiresult = queryObj["Caption"].ToString();

                // Here we call Regex.Match.
                Match match = Regex.Match(wmiresult, @"\bCOM\d+\b");

                // Here we check the Match instance.
                if (match.Success)
                {
                    //combo.Add(queryObj["Caption"].ToString(), match.Value);
                    //comboBox1.Items.Add();
                    MessageBox.Show(match.Value);
                }
            }
        }
        catch (ManagementException er)
        {
            MessageBox.Show("An error occurred while querying for WMI data: " + er.Message);
        }
    }

工作示例

private void computerButton_Click(object sender, EventArgs e)
{
    var ports = bsetup.getSerialPorts();
    comboBox1.DataSource = ports;
    //MessageBox.Show(ports.Count.ToString());
}

public IList<string> getSerialPorts()
        {
            List<string> serialPortResult = new List<string>();

            try
            {
                string wmiresult;

                ManagementObjectSearcher searcher =
                    new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE Caption like '%mbed% %Serial% %Port% %(COM%'");

                foreach (ManagementObject queryObj in searcher.Get())
                {
                    wmiresult = queryObj["Caption"].ToString();

                    // Here we call Regex.Match.
                    Match match = Regex.Match(wmiresult, @"\bCOM\d+\b");

                    // Here we check the Match instance.
                    if (match.Success)
                    {

                        //combo.Add(queryObj["Caption"].ToString(), match.Value);
                        //comboBox1.Items.Add();
                        MessageBox.Show(match.Value);

                        serialPortResult.Add(match.Value);
                    }
                }
            }
            catch (ManagementException er)
            {
                MessageBox.Show("An error occurred while querying for WMI data: " + er.Message);
            }

            return serialPortResult;
        }

【问题讨论】:

  • 你问的是//combo.Add(queryObj["Caption"].ToString()部分吗?

标签: c# winforms class object controls


【解决方案1】:

首先,您要传递Form,它是System.Windows.Forms 中表单的基类。它不会让您访问您放置在表单上的组合。您必须传递表单类型的参数(即 MyCustomForm)。

那么您的表单需要允许访问此组合。例如,您可以添加将返回它的属性。那将是最简单的,而不是最好的。

但如果不是将表单传递给setup 类,而是调用它并返回值,然后将其放入组合中,那会好得多。这段代码将放在computerButton_Click 方法中。

private void computerButton_Click(object sender, EventArgs e)
{
    var serialPorts = bsetup.getSerialPorts();
    // code to put serialPorts in combo
}

你的setup 类不应该知道视觉控制。

【讨论】:

  • 感谢您的帮助。我用我的代码编辑了我的原始帖子。
猜你喜欢
  • 1970-01-01
  • 2016-01-26
  • 2012-11-11
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
相关资源
最近更新 更多