Многострочное текстовое поле WinForms, клавиша Enter требует перемещения фокуса из текстового поля. - PullRequest
0 голосов
/ 22 января 2009

У меня есть многострочное текстовое поле и кнопка под ним.

VB.NET, WinForms, .NET 2.0

System.Windows.Forms.Textbox

Многострочный = True

AcceptsReturn = True

AcceptsTab = False

CausesValidation = False

Нет явных закодированных событий.

Мне бы хотелось, чтобы клавиша Enter вводила перевод строки и никогда не перемещала фокус на следующий элемент управления (кнопка).

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

Вместо этого происходит то, что клавиша Enter вводит один перевод строки, а затем перемещает фокус на следующий элемент управления (кнопка). Он также делает это с помощью Ctrl-Enter, что действительно сбивает меня с толку!

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

Ответы [ 3 ]

2 голосов
/ 22 января 2009

Метод, который я часто использую для решения подобных проблем, состоит в том, чтобы итеративно добавлять и вычитать код, пока я не смогу сузить его до одной причины, вызвавшей проблему.

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

В качестве альтернативы, вы можете начать с существующего (некорректно работающего) кода и начать упрощать его, пока ошибка не исчезнет. Затем вы добавляете обратно часть последней удаленной вещи и выполняете итерацию, как указано выше.

Наконец, в этом случае вы также можете попробовать добавить обработчик события для события Leave элемента управления редактирования и установить точку останова в обработчике. Когда БП срабатывает, проверьте стек вызовов и посмотрите, сможете ли вы понять, какой код ускорил изменение фокуса. Чтобы это работало, ваш отладчик, вероятно, должен быть настроен для отображения кода, для которого у вас нет исходного кода (т.е. отключите опцию Just My Code в отладчике). Вы можете даже вставить (обрезанный) стэк в вопрос, если хотите получить помощь группы в его расшифровке.

p.s. У кого-нибудь есть имя для метода итеративной отладки, описанного выше? Если нет, могу я предложить назвать его методом Ньютона (или, возможно, Ньютоном), поскольку он напоминает метод Ньютона для итеративного поиска корней математических функций.

0 голосов
/ 22 января 2009

Оказывается, я забыл, что я делал это (ниже) в другом месте в той же форме:

'http://duncanmackenzie.net/blog/Enter-Instead-of-Tab/default.aspx
Protected Overrides Sub OnKeyUp(ByVal e As System.Windows.Forms.KeyEventArgs)
    If e.KeyCode = Keys.Enter Then
        e.Handled = True
        Me.ProcessTabKey(Not e.Shift)
    Else
        e.Handled = False
        MyBase.OnKeyUp(e)
    End If
End Sub
0 голосов
/ 22 января 2009

Это определенно не должно этого делать. Единственное, что я могу подумать, это то, что у него недостаточно высоты, чтобы вместить несколько строк. Попробуйте добавить ...

textBox1.ScrollBars = ScrollBars.Vertical

Если нет, я не знаю. Попробуйте создать пустой проект и создать форму с одним текстовым полем, одной кнопкой установите свойства и посмотрите, что произойдет ...

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