这更像是设计而不是编程问题(好吧,也许不是)。我有4个CheckedListBox,它们填充了来自SQLite数据库(Visual Studio 2010)的数据,并且一些条目超出了Box的宽度。我知道我可以在CheckedListBox中包含一个水平滚动条但是每个人都讨厌水平滚动条(非常难看),所以我试图找到一个选项来自动包装不适合的文本。 因此,如果有任何解决方案,当盒子的宽度太小时将文本包裹起来就会很棒。
我可以扩展窗口大小,但宽度已经超过1000像素,而且有些用户使用的是用1024x768解决方案的木头制作的计算机,所以这不是一个真正的选择。
Datagrid将是另一种选择,但我认为必须有一个更简单的解决方案。任何提示?
编辑:对不起,这是Windows窗体。
答案 0 :(得分:1)
您可以使用带有一些实际CheckBox的面板轻松编写自己的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
然后在表单加载中或者在填充之后:
ShowScrollBar(myControl.Handle, ScrollBarDirection.SB_HORZ, False)
您也可以将现有的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