在VB中如何获取TextBox的行数?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在VB中如何获取TextBox的行数?相关的知识,希望对你有一定的参考价值。
TextBox的MultiLine=True,按钮代码如下:
Private Sub Command1_Click()
Dim hs() As String
hs = Split(Text1.Text, vbCrLf)
MsgBox UBound(hs) + 1
End Sub
但如果在Text中一直按着某个键使其自动换行时,单击按钮的最终结果总是1
如何解决该问题?
Private Function GetCurPos(ptPos As POINTAPI) As Long
Dim nLine As Long, nCol As Long
Call SendMessage(Me.Text1.hwnd, EM_GETSEL, 0, ptPos)
nLine = SendMessage(Me.Text1.hwnd, EM_LINEFROMCHAR, ptPos.x, ByVal 0&) '获得行号
nCol = ptPos.x - SendMessage(Me.Text1.hwnd, EM_LINEINDEX, -1, 0) '获得列号
GetCurPos = ptPos.x '光标位置(按字节计算)
ptPos.y = nLine
ptPos.x = nCol
End Function
'获得光标位置(按字符计算)
Private Function GetCurPosCh(ptPos As POINTAPI) As Long
Dim nLine As Long, nCol As Long
Dim ByteBuffer() As Byte
SendMessage Me.Text1.hwnd, EM_GETSEL, 0, ptPos
nLine = SendMessage(Me.Text1.hwnd, EM_LINEFROMCHAR, ptPos.x, ByVal 0&) '获得行号
nCol = ptPos.x - SendMessage(Me.Text1.hwnd, EM_LINEINDEX, -1, 0)
ReDim ByteBuffer(1024)
ByteBuffer(1) = 4
SendMessage Me.Text1.hwnd, EM_GETLINE, nLine, ByteBuffer(0)
ReDim Preserve ByteBuffer(nCol)
nCol = Len(StrConv(ByteBuffer, vbUnicode)) - 1 '获得列号
GetCurPosCh = Me.Text1.SelStart '光标位置(按字符计算)
ptPos.y = nLine + 1
ptPos.x = nCol + 1
Erase ByteBuffer
End Function
Call GetCurPosCh(ptPos)
GetTextInfo = " 第 " & ptPos.y & " 行 , 第 " & ptPos.x & " 列" 参考技术A 首先,题主要明确这并不是你的程序出了什么问题,题主贴出的代码是检测 Text1.Text 中包含多少个 vbCrlf(即回车符)的,倘若 Text1.Text 某一行字符过长,在末尾处“折叠”到了下一行,其实准确的来说,在系统看来这仍然是一行字,因为系统识别两行字就是判断有无回车符或换行符(在C语言里面就是 \n),所谓的“多行”是题主肉眼识别出来的。
可以考虑用计算字符宽度和 Text1 的宽度来计算“每行”能容纳多少个字符,然后总字符数除以单位容纳字符数就时所谓的"行数"了。 参考技术B Const EM_GETLINECOUNT = 186
Private Declare Function SendMessageAsLong Lib "user32" _
Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Private Sub Command1_Click()
Dim lCount As Long
lCount = SendMessageAsLong(Text1.hWnd, EM_GETLINECOUNT, 0, 0)
MsgBox lCount
End Sub本回答被提问者采纳 参考技术C 自动换行的情况并不会生成vbcrlf符号。
只有按了回车键才会有vbcrlf符号。所以你用split分割vbcrlf当然只能得到1的结果。
对于自动换行的内容,不能算是多行,只算一行。如果非要计算行数,要结合字符宽度和文本框的宽度来计算了。
vb.net 中 MS 访问数据库中的行数
【中文标题】vb.net 中 MS 访问数据库中的行数【英文标题】:count of rows in MS access database in vb.net 【发布时间】:2021-05-04 10:58:02 【问题描述】:有谁知道怎么回事? 我正在尝试计算 MS 访问数据库中的行数。
这是我尝试过的代码:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim conn As New OleDbConnection
conn.ConnectionString = ("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\Test Database\Database.accdb")
conn.Open()
Dim strsql As String
strsql = "Select count(*) from TABLA" '" select Panel from PANELS where ID"
Dim cmd As New OleDbCommand(strsql, conn)
Dim myreader As OleDbDataReader
myreader = cmd.ExecuteReader
myreader.Read()
PanelsInDatabase = myreader.Item(strsql)
Label1.Text = PanelsInDatabase
conn.Close()
For i As Integer = 0 To PanelsInDatabase - 1
CreatePanels()
CreateDeleteButton(_PanelName)
CreateLabels(_PanelName)
CreateLabel2(_PanelName)
Next
End Sub
如果我启动代码,我会得到一个错误:
System.IndexOutOFRangeException
【问题讨论】:
按照建议,如果您想获得单个值,您应该调用ExecuteScalar
。也就是说,如果您编写的代码有意义但您的代码没有意义,您可以调用ExecuteReader
(ExecuteScalar
在内部执行)。您在哪里见过使用包含 SQL 代码的 String
索引数据读取器的示例?你没有。每个示例都使用列的数字索引,那么您为什么希望它以其他方式工作?
@jmcilhinney Item 这些天确实需要一个字符串,但你是对的,它会是一个奇怪的 sql 导致它需要一个 sql .. SELECT 1 AS "SELECT 1 AS x FROM t" FROM t
怎么样? :)
【参考方案1】:
我已将您的用户界面代码与您的数据库代码分开。当然,我不知道CreatePanels
在做什么,也不知道_PanelName
是从哪里来的。在您的 UI 代码中,您调用 GetTABLACount
函数,该函数以整数形式返回。
在数据库代码中,使用Using...End Using
块进行连接和命令,以便即使出现错误也能正确处理它们。
由于您只检索单个数据,您可以使用.ExecuteScalar
,它返回结果集第一行的第一列作为Object
。使用CInt
获取Integer
。
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim count = GetTABLACount()
Label1.Text = count.ToString
For i As Integer = 0 To count - 1
CreatePanels()
CreateDeleteButton(_PanelName)
CreateLabels(_PanelName)
CreateLabel2(_PanelName)
Next
End Sub
Private Function GetTABLACount() As Integer
Dim dbCount As Integer
Using conn As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\Test Database\Database.accdb"),
cmd As New OleDbCommand("Select count(*) from TABLA", conn)
conn.Open()
dbCount = CInt(cmd.ExecuteScalar)
End Using
Return dbCount
End Function
【讨论】:
非常感谢。你解决了我的问题。 @Lasicak 在 Stack Overflow 上感谢某人的最佳方式是通过单击答案左侧的复选标记(勾号)来接受他们的答案。【参考方案2】:选择单个值时使用 ExecuteScalar
Dim connStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=F:\Test Database\Database.accdb"
Dim sql = "select count(*) from tabla"
Using cmd As New OleDbCommand(sql, New OleDbConnection(connStr))
cmd.Connection.Open()
Dim ct = CInt(cmd.ExecuteScalar())
End Using
【讨论】:
以上是关于在VB中如何获取TextBox的行数?的主要内容,如果未能解决你的问题,请参考以下文章