Как я могу держать несколько элементов управления в фокусе? - PullRequest
4 голосов
/ 22 ноября 2011

У меня есть вид дерева на левой стороне. При выборе узла соответствующая информация отображается в форме справа.

Смогу ли я держать дерево и любой элемент управления (текстовое поле, поле со списком, флажок) одновременно в центре внимания? Это позволит пользователю выбрать поле, внести изменения, выбрать другой узел и без необходимости возвращаться и снова выбирать то же поле, просто введите и измените значение того же поля.

Thanx.

РЕДАКТИРОВАТЬ
Я полагаю, можно было бы реализовать такое поведение вручную:

private Control __cFocus;

private void {anyControl}_Focus(object sender, EventArgs e)
{
    __cFocus = (Control)sender;
}

private void treeView1_AfterSelect(object sender, EventArgs e)
{
    __cFocus.Focus();
}

Мне просто интересно, существует ли автоматическое / более элегантное решение

РЕДАКТИРОВАТЬ 2
Итак, похоже, мне придется реализовать это вручную. Ручная реализация именно тогда. Тем не менее, теперь, кажется, есть другая проблема; не уверен, стоит ли мне задавать это как отдельный вопрос.

При выборе узла текстовое поле получает фокус, как и предполагалось, но только при использовании клавиатуры. Это не работает при выборе узла с помощью мыши. Сначала я подумал, что это может быть событие мыши, которое мешает, но пошаговое обнаружение показало, что сначала срабатывает событие MouseUp, а затем событие AfterSelect, которое устанавливает фокус, поэтому я не думаю, что оно мешает. Событие Enter текстового поля также вызывается, но по какой-то причине оно снова теряет фокус на дереве.

Thanx

Ответы [ 4 ]

2 голосов
/ 22 ноября 2011

нет, вы не можете держать два элемента управления в фокусе одновременно.Но то, что вы можете сделать, это установить фокус на целевой элемент управления в древовидном отображении события AfterSelect

private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
{
    textBox1.Focus();
    textBox1.SelectAll();
}

, а затем в текстовом поле оставить изменения, например, так:

private void textBox1_Leave(object sender, EventArgs e)
{
    //save changes here
}

thisКстати, каждый раз, когда вы выбираете элемент в древовидном меню, проверяете текстовое поле на предмет изменений и сохраняете его по мере необходимости, затем вы перефокусируете текстовое поле для следующего редактирования

1 голос
/ 22 ноября 2011

Может быть только один элемент, имеющий фокус!

Но у меня есть для вас идея, которая может решить вашу проблему.Предполагая, что у вас есть окно с TreeView и TextBox.Установите для свойства HideSelection TreeView значение false и подпишите событие AfterSelect (как уже ответил edeperson) следующим образом:

private void OnTreeViewAfterSelect(object sender, TreeViewEventArgs e)
{
    textBox1.Text = e.Node.Text;
    textBox1.Focus();
}

Затем подпишите событие KeyDown TextBox и выполните следующие действия в методе события:

private void OnTextBoxKeyDown(object sender, KeyEventArgs e)
{
    if ((e.KeyCode == Keys.Up) || (e.KeyCode == Keys.Down))
    {
        treeView1.Focus();
        SendKeys.Send(e.KeyCode == Keys.Up ? "{UP}" : "{DOWN}");
    }
}

Наконец подпишитесь на событие Leave TextBox и сделайте следующее в методе события:

private void OnTextBoxLeave(object sender, EventArgs e)
{
    if (treeView1.SelectedNode != null)
    {
        treeView1.SelectedNode.Text = textBox1.Text;
    }
}

И, вуаля, оно должно работать так, как вы ожидали ...

1 голос
/ 22 ноября 2011

Если вы хотите сосредоточиться на этом, вы можете использовать usercontrol. Вы можете поместить свое текстовое поле в usercontrol и установить фокус этого текстового поля в usercontrol, используя набор свойств при выборе дерева.

0 голосов
/ 22 ноября 2011

Нет, вы не можете, только один элемент управления может быть в фокусе в любой момент времени.

См. Комментарий Moonlight об одном способе достичь желаемого поведения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...