Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.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#_Winforms_Visibility_Menuitem_Toolstrip - Fatal编程技术网

C# 如何在按键时正确关闭文本框菜单项

C# 如何在按键时正确关闭文本框菜单项,c#,winforms,visibility,menuitem,toolstrip,C#,Winforms,Visibility,Menuitem,Toolstrip,我用径向仪表显示温度。用户应该能够重命名每个仪表,而双击名称是不可能的,因此我必须创建一个菜单,用户可以在其中更改仪表的名称 我通过为每个仪表制作一个菜单项来解决这个问题。因此,当您单击菜单项(例如“温度计1”)时,将出现ToolStripTextBox类型的子菜单,其中包含文本框中的相同文本。在该文本框中用户可以更改名称。我希望当用户在TextBox中按Enter键时,TextBox菜单项关闭,但父菜单项“Theremoter1”保持打开状态。(温度计1、温度计2……在关闭文本框菜单项后不会消

我用径向仪表显示温度。用户应该能够重命名每个仪表,而双击名称是不可能的,因此我必须创建一个菜单,用户可以在其中更改仪表的名称

我通过为每个仪表制作一个菜单项来解决这个问题。因此,当您单击菜单项(例如“温度计1”)时,将出现
ToolStripTextBox
类型的子菜单,其中包含
文本框中的相同文本。在该
文本框中
用户可以更改名称。我希望当用户在
TextBox
中按Enter键时,TextBox菜单项关闭,但父菜单项“Theremoter1”保持打开状态。(温度计1、温度计2……在关闭文本框菜单项后不会消失。)

下面是我用来关闭
TextBox
菜单的代码:

private void thermometer1ToolStripMenuItem1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == '\r')
    {
        thermometer1ToolStripMenuItem1.Visible = false;
    }
}
但正如您所看到的,小的白色条始终可见。有人能帮我吗

当用户按Enter键时,如何正确关闭
ToolStripTextBox
菜单项?那个小白条不应该一直可见


我想您需要删除子项,而不是使其可见或不可见。 我相信你的问题与温度计上有一个“看不见”的孩子有关。
尝试删除子项。

我想您需要删除子项,而不是使其可见或不可见。 我相信你的问题与温度计上有一个“看不见”的孩子有关。
尝试删除子项。

关闭下拉列表的正确方法

设置项目的
可见
不是您需要的。当您想要关闭一个菜单项时,只需找到它的所有者即可,并调用它的
close
方法:

private void someToolStripMenuItem_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == (char)Keys.Enter)
    {
        var item = (ToolStripItem)sender;
        var owner = (ToolStripDropDown)(item.Owner);
        owner.Close();
    }
}
这样,您就不会遇到小白条问题,因为您关闭了下拉列表。但是,当您没有关闭下拉列表,而是将项目的visible of设置为
false
,下拉列表仍然打开,不包含元素,因此显示为白色小条

小条问题是什么?

您看到的白色小条是一个未包含任何上述项目的开口条

只有在下拉列表打开时删除下拉列表的所有项目时,才会发生此情况;在这种情况下,下拉列表保持打开状态,不包含任何项目。一旦关闭下拉列表,它将消失,并且不会通过指向其父项显示

如果使关闭下拉列表的所有项目不可见,则该下拉列表将不会通过指向其父项而显示。开放下拉列表也需要这种行为,问题需要解决

可以检查使其不可见的项目的所有者是否不包含其他可见项目,然后使其也不可见。项目的所有者是保持打开状态的下拉列表

private void someToolStripMenuItem_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == (char)Keys.Enter)
    {
        var item = (ToolStripItem)sender;
        item.Visible = false;
        var owner = (ToolStrip)(item.Owner);
        owner.Visible = owner.Items.Cast<ToolStripItem>().Any(x => x.Visible);
    }
}
private void someToolStripMenuItem\u按键(对象发送方,按键事件参数e)
{
如果(e.KeyChar==(char)Keys.Enter)
{
变量项=(ToolStripItem)发送方;
可见项=假;
var所有者=(工具条)(项目所有者);
owner.Visible=owner.Items.Cast().Any(x=>x.Visible);
}
}

关闭下拉列表的正确方法

设置项目的
可见
不是您需要的。当您想要关闭一个菜单项时,只需找到它的所有者即可,并调用它的
close
方法:

private void someToolStripMenuItem_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == (char)Keys.Enter)
    {
        var item = (ToolStripItem)sender;
        var owner = (ToolStripDropDown)(item.Owner);
        owner.Close();
    }
}
这样,您就不会遇到小白条问题,因为您关闭了下拉列表。但是,当您没有关闭下拉列表,而是将项目的visible of设置为
false
,下拉列表仍然打开,不包含元素,因此显示为白色小条

小条问题是什么?

您看到的白色小条是一个未包含任何上述项目的开口条

只有在下拉列表打开时删除下拉列表的所有项目时,才会发生此情况;在这种情况下,下拉列表保持打开状态,不包含任何项目。一旦关闭下拉列表,它将消失,并且不会通过指向其父项显示

如果使关闭下拉列表的所有项目不可见,则该下拉列表将不会通过指向其父项而显示。开放下拉列表也需要这种行为,问题需要解决

可以检查使其不可见的项目的所有者是否不包含其他可见项目,然后使其也不可见。项目的所有者是保持打开状态的下拉列表

private void someToolStripMenuItem_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == (char)Keys.Enter)
    {
        var item = (ToolStripItem)sender;
        item.Visible = false;
        var owner = (ToolStrip)(item.Owner);
        owner.Visible = owner.Items.Cast<ToolStripItem>().Any(x => x.Visible);
    }
}
private void someToolStripMenuItem\u按键(对象发送方,按键事件参数e)
{
如果(e.KeyChar==(char)Keys.Enter)
{
变量项=(ToolStripItem)发送方;
可见项=假;
var所有者=(工具条)(项目所有者);
owner.Visible=owner.Items.Cast().Any(x=>x.Visible);
}
}

“我希望当您按enter键时,文本框将消失”-这正是发生的情况,那么您的问题是什么?您希望关闭所有菜单还是部分菜单?问题出在白色条上,请查看刷新
表单是否解决了问题
this.Refresh()白色栏是一个没有显示任何项目的菜单。你到底想发生什么?在右边的第一张图片中,你可以看到完整的菜单项显示,文本为“温度计1”的文本框,因此不仅文本框应该消失,而且整个菜单项“我希望当你按enter键时,文本框会消失”-这就是正在发生的事情,那么你的问题是什么?您希望关闭所有菜单还是部分菜单?问题出在白色条上,请查看刷新
表单是否解决了问题
this.Refresh()白色栏是一个没有显示任何项目的菜单。你到底希望发生什么?完整的菜单项显示出来,你可以在右边的第一张图片中看到,文本为“温度计1”的文本框,因此不仅文本框应该消失,整个菜单项也应该消失,而且当我删除时