Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何防止在c中的MenuStrip中多次添加项?_C#_Winforms_Mouseevent_Menustrip - Fatal编程技术网

C# 如何防止在c中的MenuStrip中多次添加项?

C# 如何防止在c中的MenuStrip中多次添加项?,c#,winforms,mouseevent,menustrip,C#,Winforms,Mouseevent,Menustrip,我正在windows窗体应用程序中使用menuStrip,我想以编程方式将可用端口添加为子菜单。我用mouseHover来做这个,但它在每个hoving动作中添加相同的项目。我的意思是它在每个hoving动作中添加项目。我如何才能防止这种情况,并实现一次添加itemsports 这是我的密码 String[] ports = SerialPort.GetPortNames(); private void cOMToolStripMenuItem_MouseHover(object sen

我正在windows窗体应用程序中使用menuStrip,我想以编程方式将可用端口添加为子菜单。我用mouseHover来做这个,但它在每个hoving动作中添加相同的项目。我的意思是它在每个hoving动作中添加项目。我如何才能防止这种情况,并实现一次添加itemsports

这是我的密码

   String[] ports = SerialPort.GetPortNames();

private void cOMToolStripMenuItem_MouseHover(object sender, EventArgs e)
    {
        foreach (var item in ports)
        {
            ToolStripItem subItem = new ToolStripMenuItem(item);
            cOMToolStripMenuItem.DropDownItems.Add(subItem);
        }
    }
这样,如果已经添加了项,函数将简单地返回。

试试这个

private void cOMToolStripMenuItem_MouseHover(object sender, EventArgs e)
{
    cOMToolStripMenuItem.DropDownItems.Clear(); 
    foreach (var item in ports)
    {
        ToolStripItem subItem = new ToolStripMenuItem(item);
        cOMToolStripMenuItem.DropDownItems.Add(subItem);
    }
}

您可以使用LINQ查询仅选择unique并执行相同的过程

string[] uniques = ports.Distinct().ToArray();

在添加之前清除所有项目如何?为什么不在窗体的加载事件中执行此操作?如果您不确定清除的代码,这里有一个有用的链接:是否确实要在悬停时填充菜单?也许您可以在初始化期间或在获得端口名时执行此操作。无论如何,您可以每次清除项目,或者,如果有其他项目,则只删除端口,您可以使用Tag属性对其进行标记。
string[] uniques = ports.Distinct().ToArray();