将复选框放在列表视图的任何单元格中

我需要将复选框放在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文件。

附加的文件
文件类型:zip lstViewChecks.zip (69.0 KB,3556视图)

From: https://bytes.com/topic/visual-basic-net/insights/880195-putting-checkboxes-any-cell-listview

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值