vb.net如何显示具有可变列宽的数据列表?

时间:2015-07-13 00:25:16

标签: vb.net listview datagridview

我有一种情况,我试图用Windows窗体中的ADODB记录集中的数据填充列表视图(或其他控件)。问题是大多数行会有几列,但有些行只有1列。我正在尝试创建一个POS解决方案,其中一些行可以是注释。 示例输出(简化为简洁):

第1行:[quantity1],[item1],[item1 description],[item1 price]
第2行:[comment1]
第3行:[quantity2],[item2],[item2 description],[item2 price]
第4行:[quantity3],[item3],[item3 description],[item3 price]
第5行:[comment2]

我希望评论行跨越控件的整个宽度。 据我所知,listview不允许这样的可变列宽。在vb.net窗体中是否有一个控件允许这种类型的格式化?或者有没有其他方法来实现这种视觉输出?

1 个答案:

答案 0 :(得分:0)

我终于从viblend找到了一个自定义的datagridview控件here,效果很好。 我仍然使用新控件找到绳索,但我可以通过以下代码动态合并行:

    Imports VIBlend.WinForms.DataGridView
    Imports VIBlend.Utilities

    Public Class Form1
        Private Sub Form1_Shown(sender As System.Object, e As System.EventArgs) Handles MyBase.Shown
            With viDataGridView1
                .AutoGenerateColumns = True
                'dt is a pre-defined dataTable variable
                .DataSource = dt
                .ColumnsHierarchy.AutoResize()
                'dataTable has 9 columns, first and last columns should be invisible
                'unless the row is a designated row for comments
                .ColumnsHierarchy.Items(0).Width = 0 'this column contains string comment, empty string for non-comment rows
                .ColumnsHierarchy.Items(8).Width = 0 'this column contains boolean flag [isComment]
                .AllowCellMerge = True
                .Refresh()
            End With
        End Sub

        Private Sub viDataGridView1_Paint(sender As System.Object, e As System.Windows.Forms.PaintEventArgs) _
                                        Handles viDataGridView1.Paint
            Dim colItem As HierarchyItem
            With viDataGridView1
                For Each rowItem In .RowsHierarchy.Items
                    colItem = .ColumnsHierarchy.Items(8) 'column with boolean flag
                    If .CellsArea.GetCellValue(rowItem, colItem).Equals(True) Then
                        'this is a comment line
                        colItem = .ColumnsHierarchy.Items(0)
                        .CellsArea.SetCellSpan(rowItem, colItem, 1, 7)
                    End If
                Next
            End With
        End Sub
    End Class