【问题标题】:vb.net how to show list of data with variable column widths?vb.net如何显示具有可变列宽的数据列表?
【发布时间】:2015-07-16 05:22:11
【问题描述】:

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

第 1 行:[数量 1]、[项目 1]、[项目 1 描述]、[项目 1 价格]
第 2 行:[comment1]
第 3 行:[数量 2]、[项目 2]、[项目 2 描述]、[项目 2 价格]
第 4 行:[数量 3]、[项目 3]、[项目 3 描述]、[项目 3 价格]
第 5 行:[comment2]

我希望注释行跨越控件的整个宽度。 据我了解,列表视图不允许像这样的可变列宽。 vb.net windows 窗体中是否有允许这种格式的控件?或者有没有其他方法可以实现这种视觉输出?

【问题讨论】:

  • 您是否尝试过从ADO 对象加载DataTable 并将其作为DataSource 分配给DataGridView 控件?就列而言,大部分工作都是为您完成的。
  • 也许 datagridview 控件更符合我的要求,尽管我不知道如何在运行时动态合并单元格或更改单元格宽度。我想显示发票的行,并根据该行是否为注释行动态更改每行的单元格宽度。我在每一行上都有一个布尔开关,以显示它是否是注释。如果开关为真,我想将除包含注释的单元格宽度之外的所有单元格宽度设置为零。这可能吗?
  • 只是为了表明我正在积极寻找答案 :) 我遇到了这个问题:vbforums.com/… 一个重载的 cellPainting 事件似乎是正确的方向,但我无法让它工作.似乎对这种功能有足够的需求,以至于会有一些本机包含此功能的控件,但我找不到。

标签: vb.net listview datagridview


【解决方案1】:

我终于找到了来自 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多