我有启用了MultiLine的TextBox。 如何获取TextBox.Click事件中的单击行数?
答案 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