Как я могу получить количество нажатых строк в TextBox? - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть TextBox с включенной MultiLine.Как я могу получить количество нажатых строк в событии TextBox.Click?

Ответы [ 3 ]

0 голосов
/ 09 февраля 2019

одно решение определяет его по высоте строки текстового поля, например:

Dim LineHeight = 16 ' you may change this value

Private Sub richTextBox1_MouseClick(sender As Object, e As MouseEventArgs)

  'the number of the selected line
  Dim i = e.Location.Y/LineHeight

  'get the value of the number line.
  MessageBox.Show(Me.richTextBox1.Lines(i))
End Sub
0 голосов
/ 10 февраля 2019

У Стива отличный ответ, который научил меня нескольким вещам, но, поскольку он использовал MouseDown вместо Click, я подумал, что могу дать другой вариант и немного расширить разницу между ними.

I 'Я покажу вам мой код в случае, если это все, что вы хотите, но если вы хотите немного больше информации, то вы можете прочитать дальше.

Код (используя Click как запрошено):

Private Sub mainTextBox_Click(sender As Object, e As EventArgs) Handles mainTextBox.Click
    Dim line As Integer = mainTextBox.GetLineFromCharIndex(mainTextBox.SelectionStart)
End Sub

Получает местоположение курсора выделения, который перемещается туда, куда вы щелкаете, вместо местоположения мыши.Так как это событие щелчка находится на самом TextBox, курсор должен перемещаться каждый раз, и поэтому он должен быть относительно эквивалентным ответу Стива с использованием местоположения мыши, но я не проверил его полностью, чтобы быть уверенным во всехкрайние случаи (да, курсор выбора перемещается до вызова события click, я так много тестировал).

О, и не забывайте, что он дает индекс строки, поэтому первая строкафактически возвращает 0, второе возвращает 1 и т. д.


Дополнительные биты:

Поскольку Стив использовал MouseDown, я подумал упомянуть, как он отличается от Click / MouseClick весли вы (или какой-то будущий читатель) не знаете.MouseDown вызывается, как только нажимается кнопка мыши, затем MouseUp вызывается при ее отпускании, а затем вызываются Click / MouseClick.Если точное время не имеет значения для вашего использования, тогда вам будет хорошо, если вы захотите, если это имеет значение, есть несколько хороших ответов, которые объясняют различия более подробно (вот тот, который объясняет Нажмите против MouseClick , например).

Здесь вы также можете увидеть, как можно проделать тот же трюк с MouseClick и MouseDown:

Private Sub mainTextBox_MouseClick(sender As Object, e As MouseEventArgs) Handles mainTextBox.MouseClick
    Dim line As Integer = mainTextBox.GetLineFromCharIndex(mainTextBox.SelectionStart)
End Sub

Private Sub mainTextBox_MouseDown(sender As Object, e As MouseEventArgs) Handles mainTextBox.MouseDown
    Dim line As Integer = mainTextBox.GetLineFromCharIndex(mainTextBox.SelectionStart)
End Sub

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

0 голосов
/ 09 февраля 2019

Класс TextBoxBase (из которого происходит TextBox) имеет много методов, которые могут помочь вам в этой задаче.

Предположим, у вас есть этот обработчик для события MouseDown вашего элемента управления TextBox1

Sub TextBox1_MouseDown(sender as Object, e as MouseEventArgs) Handles TextBox1.MouseDown

    '  In the MouseEventArgs we have the click location
    '  We can use that point to get the CharIndex from the TextBox
    Dim charIndex as Integer = TextBox1.GetCharIndexFromPosition(e.Location)

    ' Now the charIndex could be passed to another method to get the line index
    Dim line As Integer = TextBox1.GetLineFromCharIndex(charIndex)

    ' Lines start from 0
    MessageBox.Show("Click on line=" + line + ", Text=" + TextBox1.Lines(line))
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...