Как выбрать элемент управления для фокусировки из ListView - PullRequest
0 голосов
/ 29 марта 2012

Рассмотрим следующую форму:

enter image description here

Я хочу, чтобы текстовое поле1 или текстовое поле2 было сфокусировано, когда я нажимаю «1» или «2» в представлении списка.

Я написал следующий код:

  private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
    {
        if (e.IsSelected)
        {
            if (e.Item.Text == "1")
                textBox1.Focus();
            else
                textBox2.Focus();
        }
    }

Но это не работает.(Текстовое поле фокусируется на мгновение, но после этого фокус возвращается к просмотру списка.) Я хочу, чтобы фокус был на текстовом поле при выборе соответствующего элемента в просмотре списка.

Есть предложения?

Спасибо за помощь.

Ответы [ 2 ]

2 голосов
/ 29 марта 2012

Фокус сбрасывается на ListView из-за порядка запуска событий.

  1. MouseDown - выбирает элемент в виде списка.
  2. ItemSelectionChanged - Звонки listView1_ItemSelectionChanged.
  3. MouseUp - Если курсор все еще находится над listView1, это устанавливает фокус на представление списка.

Отключение элемента управления будет работать, но при нажатии на элемент добавляется «мерцание». В противном случае вы можете отследить выбранный элемент на MouseDown и MouseUp / MoustLeave и соответственно установить фокус.

private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e)
{
    if (e.IsSelected)
    {
        if (e.Item.Text == "1")
            textBox1.Focus();
        else
            textBox2.Focus();
    }
    listView1.Enabled = false;
}

private void listView1_MouseUp(object sender, MouseEventArgs e)
{
    listView1.Enabled = true;

}

private void listView1_MouseLeave(object sender, EventArgs e)
{
    listView1.Enabled = true;
}

Примечание: нужно ли вам использовать ListView? Сделал быстрый тест на моем конце и ListBox ведет себя так, как вы хотите, без каких-либо взломов.

1 голос
/ 29 марта 2012

Мммм, возможно ListView снова получает фокус, когда возвращается из команды Focus / Select.Одним из способов может быть использование обратного вызова с таймером / задержкой и просто запускать его, т. Е. Сделать его асинхронным, скажем, через 50 мсек, тогда событие ListView onclick завершится к тому времени, когда будет передано управление временем.

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