2016-07-17 2 views
1

Я использую радиальные датчики для отображения температуры. Пользователь должен иметь возможность переименовывать каждый калибр, что невозможно, дважды щелкнув имя, поэтому я должен создать меню, в котором пользователь может изменить имена датчиков.Как правильно закрыть элемент меню TextBox на KeyPress

Я решил это, сделав пункт меню для каждого калибра. Поэтому, когда вы нажимаете на элемент меню, например «Термометр 1», появится подменю типа ToolStripTextBox, содержащее тот же текст в TextBox. В этом TextBox пользователь может изменить имя. Я хочу, когда пользователь нажимает . Введите в TextBox пункт меню текстового поля закрывается, но родительский пункт меню «Таммометр1» остается открытым. (Thermometer1, Thermometer2, ... не shooul исчезают после закрытия пункта меню текстового поля.)

Вот код, я использую, чтобы закрыть это TextBox меню:

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

Но, как вы можете увидеть небольшую белую полосу остается видимым. Может кто-то мне помочь, пожалуйста?

Как я могу закрыть этот пункт меню ToolStripTextBox правильно, когда пользователь нажимает Введите? Эта маленькая белая полоса не должна оставаться видимой.

The Menuitems

The small white bar

+0

_ «Я хочу, чтобы при нажатии введите, что текстовое поле исчезнет» _ - это именно то, что происходит, и в чем ваш вопрос? Вместо этого вы хотите, чтобы все меню закрылись или некоторые из них? – CodeCaster

+0

Белая полоса - это проблема – The5thBluesky

+0

, если обновление «Формы» исправляет проблему или нет. 'this.Refresh();' –

ответ

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

Использование первого метода - это ответ на ваш вопрос, и, конечно же, он не сделает Thermometer1, Theremometer2 невидимым. Просто используйте чистый образец кода и присоедините этот обработчик событий 'someToolStripMenuItem_KeyPress' только для нажатия на меню, содержащее текстовое поле. Затем, после нажатия ввода в текстовом поле, меню текстового поля будет закрыто. –

+1

если я делаю чистый образец кода, он работает, но не в моем другом коде -.- – The5thBluesky

+0

Это означает, что мой ответ правильный :) Цель этой темы - решить текущую проблему и показать, как правильно закрыть меню. Для других проблем задайте новые вопросы и задайте этот вопрос только по одной теме. –

0

Я думаю, вы должны удалить подпункт а не сделать его видимым или нет. Я считаю, что ваша проблема связана с «невидимым» ребенком от Thermometer1. Попробуйте удалить дочерний элемент.

+0

, но когда я удаляю дочерний элемент, я больше не мог изменять имя во время этой среды выполнения, могу ли я? – The5thBluesky

+0

Нет, не получится. Но ни если он больше не виден ... Это ошибка логики, поэтому ... –