VB.Net CheckedListBox自动换行文本

VB.Net CheckedListBox自动换行文本,vb.net,Vb.net,这与其说是编程问题,不如说是设计问题(好吧,也许不是)。我有4个CheckedListBox,其中填充了来自SQLite数据库(VisualStudio2010)的数据,有些条目超出了框的宽度。我知道我可以在CheckedListBox中包含一个水平滚动条,但每个人都讨厌水平滚动条(非常难看),所以我尝试找到一个选项来自动包装不合适的文本。 因此,如果有任何解决方案,当文本框的宽度太小时,将文本包装起来,这将是非常棒的 我可以扩展窗口的大小,但它的宽度已经超过1000像素,一些用户使用木材制成的

这与其说是编程问题,不如说是设计问题(好吧,也许不是)。我有4个CheckedListBox,其中填充了来自SQLite数据库(VisualStudio2010)的数据,有些条目超出了框的宽度。我知道我可以在CheckedListBox中包含一个水平滚动条,但每个人都讨厌水平滚动条(非常难看),所以我尝试找到一个选项来自动包装不合适的文本。 因此,如果有任何解决方案,当文本框的宽度太小时,将文本包装起来,这将是非常棒的

我可以扩展窗口的大小,但它的宽度已经超过1000像素,一些用户使用木材制成的计算机,并使用1024x768解决方案,所以这不是一个真正的选择

Datagrid将是另一个选择,但我认为必须有一个更简单的解决方案。有什么提示吗


编辑:抱歉,这是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