如何在KeyPress上正确关闭TextBox菜单项

时间:2016-07-17 21:25:24

标签: c# winforms visibility menuitem toolstrip

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

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

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

private void thermometer1ToolStripMenuItem1_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == '\r')
    {
        thermometer1ToolStripMenuItem1.Visible = false;
    }
}

但是你可以看到小白条保持可见。有人能帮帮我吗?

当用户按 Enter 时,如何正确关闭ToolStripTextBox菜单项?那小白条不应该保持可见。

The Menuitems

The small white bar

2 个答案:

答案 0 :(得分:3)

关闭下拉列表的正确方法

设置项目Visible不是您需要的。当您想要关闭菜单项时,它足以找到它的所有者ToolStripDropDown并调用其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();
    }
}

这样你就不会面对那个小白条问题了,因为你关闭了下拉列表。但是,当您将项目的可见项设置为false而不是关闭下拉列表时,下拉列表仍然打开,不包含元素,因此它显示为小白条。

小条问题是什么?

您看到的小白条是一个开放的ToolStripDropDown,不包含上述任何项目。

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

如果您使关闭的下拉列表中的所有项目都不可见,则下拉列表将不会通过指向其父级来显示。打开下拉列表也需要此行为,问题需要解决方法。

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

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);
    }
}

答案 1 :(得分:0)

我猜你需要删除子项而不是让它可见。 我相信你的问题与一个&#34;隐形&#34;来自Thermometer1的孩子。 尝试删除子项。