VB.Net CheckedListBox自动换行文本
这与其说是编程问题,不如说是设计问题(好吧,也许不是)。我有4个CheckedListBox,其中填充了来自SQLite数据库(VisualStudio2010)的数据,有些条目超出了框的宽度。我知道我可以在CheckedListBox中包含一个水平滚动条,但每个人都讨厌水平滚动条(非常难看),所以我尝试找到一个选项来自动包装不合适的文本。 因此,如果有任何解决方案,当文本框的宽度太小时,将文本包装起来,这将是非常棒的 我可以扩展窗口的大小,但它的宽度已经超过1000像素,一些用户使用木材制成的计算机,并使用1024x768解决方案,所以这不是一个真正的选择 Datagrid将是另一个选择,但我认为必须有一个更简单的解决方案。有什么提示吗VB.Net CheckedListBox自动换行文本,vb.net,Vb.net,这与其说是编程问题,不如说是设计问题(好吧,也许不是)。我有4个CheckedListBox,其中填充了来自SQLite数据库(VisualStudio2010)的数据,有些条目超出了框的宽度。我知道我可以在CheckedListBox中包含一个水平滚动条,但每个人都讨厌水平滚动条(非常难看),所以我尝试找到一个选项来自动包装不合适的文本。 因此,如果有任何解决方案,当文本框的宽度太小时,将文本包装起来,这将是非常棒的 我可以扩展窗口的大小,但它的宽度已经超过1000像素,一些用户使用木材制成的
编辑:抱歉,这是Windows窗体。您可以使用带有一些实际复选框的面板非常轻松地编写自己的
CheckedListBox
,这样您就可以执行其他您希望的操作,例如禁用某些操作、修复其删除拖放字符的方式、迭代它们等等
换行的问题是a)确定长文本的文本范围,以便知道每个复选框的高度;b)必须保持项目的累积高度,以便知道下一个项目的添加位置。当然,一旦你支持包装,你就必须能够调整它们,这一切都涉及到当文本改变导致中间的一个增长/收缩时移动它们。
面板的AutoScroll为您处理所有的滚动,包括根据需要添加一个HSCroll,这并不总是可取的。克服这个问题的一种方法是吃HScroll,这可能适用于您正在使用的实际CheckedListBox
<DllImport("user32.dll")> _
Private Shared Function ShowScrollBar(hWnd As IntPtr,
wBar As Integer,
bShow As Boolean) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
您还可以对现有的CheckedListBox进行子类化,以在
OnClientSizeChanged
Public Class CheckedListBox2
Inherits CheckedListBox
' optionally remove the scroll bar
Public Property VerticalScrollOnly As Boolean
' PInvokes
<DllImport("user32.dll", SetLastError:=True)>
Public Shared Function GetWindowLong(ByVal hWnd As IntPtr,
ByVal nIndex As Integer) As Integer
End Function
<DllImport("user32.dll")>
Private Shared Function ShowScrollBar(hWnd As IntPtr,
wBar As Integer,
bShow As Boolean) _
As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
'// window style constants for scrollbars
Private Const WS_VSCROLL As Integer = &H200000
Private Const WS_HSCROLL As Integer = &H100000
Private Const GWL_STYLE As Integer = -16
Private Enum ScrollBarDirection
SB_HORZ = 0
SB_VERT = 1
SB_CTL = 2
SB_BOTH = 3
End Enum
' eat the HScroll when it shows up
Protected Overrides Sub OnClientSizeChanged(e As EventArgs)
Dim HScrollVis As Boolean
HScrollVis = IsHScrollVisible(Me)
If VerticalScrollOnly AndAlso HScrollVis Then
ShowScrollBar(MyBase.Handle, ScrollBarDirection.SB_HORZ, False)
End If
MyBase.OnClientSizeChanged(e)
End Sub
Friend Shared Function IsHScrollVisible(ByVal ctl As Control) As Boolean
Dim wndStyle As Integer = GetWindowLong(ctl.Handle, GWL_STYLE)
Return ((wndStyle And WS_HSCROLL) <> 0)
End Function
End Class
公共类CheckedListBox2
继承CheckedListBox
'可以选择删除滚动条
公共属性VerticalScroll仅作为布尔值
“平沃克斯
公共共享函数GetWindowLong(ByVal hWnd作为IntPtr,
ByVal nIndex(作为整数)作为整数
端函数
专用共享功能显示滚动条(hWnd作为IntPtr,
wBar作为整数,
b显示为布尔值)\u
作为布尔值
端函数
'//滚动条的窗口样式常量
私有常量WS_VSCROLL为整数=&H200000
私有常量WS_HSCROLL为整数=&H100000
Private Const GWL_样式为整数=-16
私有枚举滚动方向
SB_HORZ=0
SB_垂直=1
SB_CTL=2
SB_都=3
结束枚举
“当它出现的时候,就把它吃掉
受保护的覆盖子OnClientSizeChanged(e作为事件参数)
Dim HScrollVis作为布尔值
HScrollVis=可见(Me)
如果仅垂直滚动,也仅垂直滚动,则
ShowScrollBar(MyBase.Handle、ScrollBarDirection.SB_HORZ、False)
如果结束
MyBase.OnClientSizeChanged(e)
端接头
好友共享函数(ByVal ctl作为控件)为布尔值
Dim wndStyle As Integer=GetWindowLong(ctl.Handle,GWL_样式)
返回((wndStyle和wshscroll)0)
端函数
末级
Webforms、MVC或Windows窗体应用程序?我的第一个想法是OwnerDraw,但显然,尽管如此,这表明它可能没那么糟糕。@Michael\B抱歉,这是Windows窗体应用程序。问题是CheckedListBox是从SQLite数据库中动态填充的,因此设计基本上是固定的。我不知道数据源是如何发挥作用的。或者说设计,你是指用户界面吗?您在替换中使用的任何控件都可以被写入相同的工作状态。但是如果用户界面是一成不变的,你是在寻找一个神奇的属性吗?没有。请看编辑。谢谢你的努力,但我真的不知道你说的“吃滚动条”是什么意思。如果我愿意,我可以停用它,这不是问题所在。我只是觉得CheckedListBox有一个选项我没有看到,因为在DataGridView中可以自动包装文本。
Public Class CheckedListBox2
Inherits CheckedListBox
' optionally remove the scroll bar
Public Property VerticalScrollOnly As Boolean
' PInvokes
<DllImport("user32.dll", SetLastError:=True)>
Public Shared Function GetWindowLong(ByVal hWnd As IntPtr,
ByVal nIndex As Integer) As Integer
End Function
<DllImport("user32.dll")>
Private Shared Function ShowScrollBar(hWnd As IntPtr,
wBar As Integer,
bShow As Boolean) _
As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function
'// window style constants for scrollbars
Private Const WS_VSCROLL As Integer = &H200000
Private Const WS_HSCROLL As Integer = &H100000
Private Const GWL_STYLE As Integer = -16
Private Enum ScrollBarDirection
SB_HORZ = 0
SB_VERT = 1
SB_CTL = 2
SB_BOTH = 3
End Enum
' eat the HScroll when it shows up
Protected Overrides Sub OnClientSizeChanged(e As EventArgs)
Dim HScrollVis As Boolean
HScrollVis = IsHScrollVisible(Me)
If VerticalScrollOnly AndAlso HScrollVis Then
ShowScrollBar(MyBase.Handle, ScrollBarDirection.SB_HORZ, False)
End If
MyBase.OnClientSizeChanged(e)
End Sub
Friend Shared Function IsHScrollVisible(ByVal ctl As Control) As Boolean
Dim wndStyle As Integer = GetWindowLong(ctl.Handle, GWL_STYLE)
Return ((wndStyle And WS_HSCROLL) <> 0)
End Function
End Class