如何获取TextBox中的单击的行数?

时间:2019-02-09 19:30:45

标签: .net vb.net winforms

我有启用了MultiLine的TextBox。 如何获取TextBox.Click事件中的单击行数?

4 个答案:

答案 0 :(得分:2)

TextBoxBase类(TextBox派生自该类)具有许多可以帮助您完成此任务的方法。

假设您具有TextBox1控件的MouseDown事件的此事件处理程序

@Mapper(componentModel = "spring", uses = { MapperUtils.class })
public interface CustomerTagApiMapper {

    CustomerTagAPI toCustomerTagApi(CustomerTag customerTag);

}

@Mapper(componentModel = "spring", uses = {  CustomerTagApiMapper.class, MapperUtils.class })
public interface CustomerApiMapper {

    CustomerAPI toCustomerApi(Customer customer);

}

答案 1 :(得分:0)

一种解决方案是通过文本框的行高来确定它,例如:

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

答案 2 :(得分:0)

史蒂夫(Steve)有一个很好的答案,它教给我一些知识,但是由于他使用MouseDown而不是单击(Click),所以我想我可以给出另一个选择,并扩大两者之间的区别。

我将向您展示我的代码,以防万一,但是如果您想了解更多信息,可以继续阅读。

代码(按要求使用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本身上,因此光标每次都应移动,因此应该相当于使用鼠标位置的史蒂夫的答案,但我尚未对其进行全面测试以确保所有边缘情况(是的,在单击事件被调用之前,选择光标已经移动,我已经做了很多测试)。

哦,别忘了它给出了行的索引,因此第一行实际上将返回0,第二行返回1,依此类推。


其他位:

自从史蒂夫使用MouseDown以来,我想我要提一下它与Click / MouseClick有何不同,以防您(或某些未来的读者)不知道。按下鼠标按钮后立即调用MouseDown,然后在释放鼠标时调用MouseUp,然后再调用Click / MouseClick。如果确切的时机对您的使用无关紧要,那么您可以按自己的意愿使用,如果确实重要,那么那里有一些很好的答案可以更详细地解释这些差异(这里有一个解释{{ 3}})。

您可以在这里看到如何使用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

我可以进行快速测试,因为我目前正在研究某种东西,但是我没有对Steve的方法或我自己的方法进行过广泛的测试,所以我无法说出一个绝对比另一个更好。您可能要同时尝试这两种方法,然后看看最适合您的方法。

答案 3 :(得分:0)

对于名为 tbData 的文本框(行从零开始,因此需要加 1):

Private Sub tbData_MouseClick(ByVal sender As System.Object, ByVal e As MouseEventArgs) Handles tbData.MouseClick
    Dim msg As String
    Dim lineClicked As Int32
    lineClicked = tbData.GetLineFromCharIndex(tbData.GetCharIndexFromPosition(e.Location)) + 1
    msg = "clicked line " + lineClicked.ToString()
    MsgBox(msg)
End Sub