VB.Net CheckedListBox自动换行文本



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

我可以扩展窗口的大小,但它的宽度已经超过1000px了,有些用户使用的电脑是木制的,分辨率是1024x768,所以这不是一个真正的选择。

数据网格将是另一个选择,但我认为必须有一个更容易的解决方案。有提示吗?

编辑:对不起,这是Windows窗体

你可以很容易地写自己的CheckedListBox使用面板上的一些实际的复选框,所以你可以做你期望的其他事情,如禁用某些,修复它的方式切断掉字符,迭代他们等等。

换行的问题是a)确定长文本的文本范围,这样你就知道每个复选框的高度,b)必须保持累积项的高度,这样你就知道在哪里添加下一个。当然,一旦你支持自动换行,你就必须能够调整它们,这包括当文本变化导致中间的一个变大或缩小时移动它们。

面板的自动滚动处理所有的滚动,其中包括添加一个HSCroll需要,这并不总是可取的。克服这个问题的一种方法(可能适用于您正在使用的实际CheckedListBox)是使用HScroll。

<DllImport("user32.dll")> _
Private Shared Function ShowScrollBar(hWnd As IntPtr, 
              wBar As Integer, 
              bShow As Boolean) As <MarshalAs(UnmanagedType.Bool)> Boolean
End Function

然后在form load中或者在你填充完之后:

ShowScrollBar(myControl.Handle, ScrollBarDirection.SB_HORZ, False)

你也可以子类化现有的checklistbox来吃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

最新更新