友好的端口名称组合框c# Windows Form

问题描述 投票:0回答:2

我有一个关于友好名称的问题,我读了很多(真的很多)关于如何获得友好名称的内容。我什至使用了 WMICodeCreator 我有一个代码要放置。但实际上我不明白如何将其添加到我的组合框菜单中。这是我的代码。实际上,这个显示的是计算机上可用的 COM 端口,但我想显示这个端口的友好名称,以使我的应用程序更易于使用。我怎样才能显示友好名称而不是“COMx”? 我正在 C# 上使用 Windows 窗体应用程序。

    public partial class Form1 : Form
{
    private SerialPort myport;
    public Form1()
    {
        InitializeComponent();
        myport = new SerialPort();
    }

    private void portbox_DropDown(object sender, EventArgs e)
    {
        string[] ports = SerialPort.GetPortNames();

        portbox.Items.Clear();

        foreach (string port in ports)
        {
           portbox.Items.Add(port);
        }
    }

    private void butvalidate_Click(object sender, EventArgs e)
    {
        myport.BaudRate = 9600;
        myport.PortName = portbox.SelectedItem.ToString();
        myport.Open();
    }

提前感谢您的帮助

c# combobox windows-forms-designer
2个回答
0
投票

这是一个老问题,但当我搜索相关内容时它出现了,所以我将发布用于此精确目的的代码。

我从 SerialPort 获取 portNames 列表,然后将它们与从 WMI 查询检索到的友好名称列表进行匹配,并将它们放入字典中,以 portName 作为键,以友好名称作为值。然后我使用此字典作为 ComboBox 的 BindingSource。还有其他方法可以做到这一点,但我发现这种方法简单明了。

这个术语有点令人困惑,因为 ComboBox 有一个用于显示文本的 DisplayMember 和一个作为 SelectedValue 提供的 ValueMember。 DisplayMember 是字典“Value”,ValueMember 是字典“Key”。

    using System.Management;
    private void getAvailablePorts()
    {
        // Get friendly names to go along with the actual portNames
        using (var searcher = new ManagementObjectSearcher("SELECT * FROM WIN32_SERIALPORT"))
        {
           var portDictionary = new Dictionary<string, string>();
           var portNames = SerialPort.GetPortNames().OrderByDescending(s => s.GetAlphaNumericOrderToken()).ToArray<object>();
           var portList = searcher.Get().Cast<ManagementBaseObject>().ToList();

            foreach( var portName in portNames)
            {
                // WMI does not always find all com ports so provide a null alternative
                var portDesc = portList.Where(p => p["DeviceID"].ToString() == portName.ToString()).Select(q => q["Caption"].ToString()).FirstOrDefault() ?? portName.ToString();
                portDictionary.Add(portName.ToString(), portDesc);
            }
            portComboBox.DataSource = new BindingSource(portDictionary, null);
            portComboBox.DisplayMember = "Value";
            portComboBox.ValueMember = "Key";

            // I set my comboBox Selected entry to be the one with a friendly name 
            // beginning with "Teensy" (of course yours will be different, 
            // or you can leave this out)
            portComboBox.SelectedIndex = portComboBox.FindString("Teensy");  // -1 if not found
            if (portComboBox.SelectedIndex < 0)
                portComboBox.Selected = 0;
        }
    }

用途:

            // Since the ComboBox text is now different from the value, 
            // you have to specifically get the SelectedValue of the ComboBox 
            // rather than just its text. 
            var _port = new SerialPort(portComboBox.SelectedValue.ToString());

我希望这对某人有帮助!


0
投票

你的代码对我帮助很大,因为我真的不知道该怎么做。但是,我在“GetAlphaNumericOrderToken()”函数调用中遇到错误,因为它告诉我它不包含定义等。我已经研究了后者,但没有找到有关引用或要放置的函数的任何内容在代码中。 你知道我的问题是什么吗? 预先感谢!

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.