4

システムで利用可能な既存の COM ポートをドロップダウン リストに追加しています。これまでのところ、私はこれを持っています:

private void Form1_Load(object sender, EventArgs e)
{ 
    foreach (string port in System.IO.Ports.SerialPort.GetPortNames())
    {
        ToolStripMenuItem t = new ToolStripMenuItem();
        t.Text = port;
        t.Checked = port == notifier.COMPort;
        t.Click += t_Click;
        setPortToolStripMenuItem.DropDownItems.Add(t);
    }
}

これは最初にポートを追加するときに機能しますが、ユーザーがドロップダウンボックスをクリックしてポートを表示する前に、追加または削除された COM ポートを再度確認したいと思います。

使用できるようですが、追加するときに使用するキーがわかりsetPortToolStripMenuItem.DropDOwnItems.ContainsKey()ません。

これは動作しません:

private void setPortToolStripMenuItem_DropDownOpening(object sender, EventArgs e)
{
    string[] ports = System.IO.Ports.SerialPort.GetPortNames();

    foreach (string s in ports)
    {
        if (!setPortToolStripMenuItem.DropDownItems.ContainsKey(s))
        {
            ToolStripMenuItem t = new ToolStripMenuItem();
            t.Text = s;
            t.Checked = s == notifier.COMPort;
            t.Click += t_Click;
            setPortToolStripMenuItem.DropDownItems.Add(t);
        }
    }
}

アイテムを追加するときに使用するキーを指定できますか? または、既存のアイテムを確認する別の方法はありますか?

4

2 に答える 2

4

ContainsKey を機能させる

Name-property on を設定してみてくださいToolStripMenuItem:

ToolStripMenuItem t = new ToolStripMenuItem();

t.Name = port; // Set the name of the ToolStripMenuItem to the port.

t.Text = port;
t.Checked = port == notifier.COMPort;
t.Click += t_Click;
setPortToolStripMenuItem.DropDownItems.Add(t);

その後、ContainsKey(s)動作します:

foreach (string s in ports)
{
    if (!setPortToolStripMenuItem.DropDownItems.ContainsKey(s))
    {
        //....
    }
}

Linq でそれを行う

Linq を使用して、ToolStrip にないすべてのポートを取得することもできます。

string[] ports = System.IO.Ports.SerialPort.GetPortNames();

var existingPorts = setPortToolStripMenuItem.DropDownItems
    .OfType<ToolStripMenuItem>()
    .Select(t => t.Text); // Or t.Name if you set that.

var portsToAdd = ports.Except(existingPorts);

これで、ドロップダウンにないすべてのポートが に表示されるportsToAddので、これ以上チェックしなくても追加できます。

Linqの詳細については、こちらを参照してください。

于 2013-08-16T20:57:17.360 に答える
1

ええ、あなたはこのようにチェックすることができます -

bool alreadyExist = setPortToolStripMenuItem.DropDownItems
                     .OfType<ToolStripItem>()
                      .Any(item => item.Text.Equals(s));
于 2013-08-16T20:55:03.477 に答える