我需要将复选框放在listview控件的几个单元格中。 listview控件的工作方式实际上只能在第一个单元格中具有一个“官方”复选框,并且几乎每次转动都会阻止将它们放置在其他任何位置的尝试。
因此,我使用WingDings开发了一种简单的方法。 WingDings字体具有一个选中和未选中的框。 在此项目中,我将WingDings的未选中框放在我想要选中的任何单元格的中心,然后单击该单元格将导致WingDing选中和未选中字符之间的切换。
已检查Chr(168),未选中Chr(254)。
(将鼠标悬停在下面的图片上可以查看整个内容...。)
技巧是将特定单元格中的字体设置为WingDings。
首先,我们必须创建一个字体对象:
Dim myCheckFont As New System.Drawing.Font("Wingdings", 12, FontStyle.Regular)
然后,我们需要将其分配给要在其中具有复选框的特定单元格。
您在创建单元格时设置字体。
因此,在以下示例中,我将在实例化3列的列表视图中创建一个16行的表。
每次将项目添加到第1列时,我们都将字体设置为MyCheckFont(上面分配的WingDings字体)。
With ListView1
For I As Integer = 0 To 15
.Items.Add("test" & I.ToString)
.Items(I).UseItemStyleForSubItems = False
.Items(I).SubItems.Add(Chr(168))
.Items(I).SubItems.Item(1).ForeColor = Color.DarkRed
.Items(I).SubItems.Item(1).Font = myCheckFont
ReDim bOWCheck(I)
Next I
End With
这里的技巧是确保将UseItemSylteForSubItems设置为FALSE。
如果不这样做,那么我们就不能为不同的列使用单独的字体。
那真是一件好东西!
最后,您唯一需要管理的就是捕获特定列和行中的单击,以便随后可以在代表选中和未选中框的两个WingDing字符之间切换。
某些深奥的功能也浸入其中。 为什么MS没有给我们提供一种简单的方法来获取被点击的单元格,这超出了我的范围-但是他们没有提供,因此我们必须以艰辛的方式做到这一点。
在listview MouseUp事件中,我有以下代码
Private Sub ListView1_MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListView1.MouseUp
Dim cellLoc As MyCell
cellLoc = WhichCell(ListView1, e.X, e.Y)
If cellLoc.Col = 2 Then
If bOWCheck(cellLoc.Row) = True Then
ListView1.Items(cellLoc.Row).SubItems(cellLoc.Col - 1).Text = Chr(168)
bOWCheck(cellLoc.Row) = False
Else
ListView1.Items(cellLoc.Row).SubItems(cellLoc.Col - 1).Text = Chr(254)
bOWCheck(cellLoc.Row) = True
End If
End If
End Sub
请注意whichcell函数-这正在做深奥的工作...
Private Function WhichCell(ByVal lvw As ListView, ByVal X As Integer, ByVal Y As Integer) As MyCell
Dim colstart As Integer = 0
Dim colend As Integer = 0
Dim xCol As Integer
For xCol = 0 To (ListView1.Columns.Count - 1)
colend = colend + ListView1.Columns(xCol).Width
If colstart <= X And X <= colend Then
WhichCell.Col = xCol + 1
Exit For
End If
colstart = colstart + ListView1.Columns(xCol).Width
Next
WhichCell.Row = ListView1.FocusedItem.Index
Return WhichCell
End Function
最后-为了跟踪复选框,我有一个布尔数组:bOWCheck(),我将其索引到当前行。
如果您有多列,只需向数组添加另一个维度。
这是我们为每个单元格保留复选框状态的地方。
请注意,它会在列表视图MouseUp事件中切换,同时切换WingDing选中和未选中的字符。
可能有几种更好的方法可以做到这一点。 当然欢迎改进。
我已经为您可以播放的VS2008 VB.NET项目附加了一个zip文件。
From: https://bytes.com/topic/visual-basic-net/insights/880195-putting-checkboxes-any-cell-listview