【问题标题】:Improve DataGridView rows managing改进 DataGridView 行管理
【发布时间】:2015-06-16 12:40:07
【问题描述】:

场景

我正在用 DataGridViewRow 集合手动填充 DataGridView

我在设计时在 Visual Studio 的 GUI 构建器中创建了这些列。

  • 第一列采用 整数 值,即DataGridViewTextBoxColumn
  • 第二列采用 Icon 对象,即DataGridViewImageColumn
  • 第三列采用 String 值,即DataGridViewTextBoxColumn
  • Fourth 采用 String 值,即DataGridViewComboBoxColumn

所以,当我想添加新行时,我会这样做:

Dim dgvr As New DataGridViewRow
With dgvr
    .CreateCells(MyDataGridView)
    .Cells(0).Value = An Integer value
    .Cells(1).Value = An Icon object
    .Cells(2).Value = An String value
    .Cells(3).Value = An existing ComBoBox item name.
End With

MyDataGridView.Rows.Add(dgvr)

问题

我的意图是遵循良好的编程习惯,然后,为了避免这种与 UI 的交互,我更愿意使用和管理 DataSource,然后我可以如何创建一个DataTable 采用相同类型的值将其设置为控件的DataSource?有可能吗?

如果没有,我能做些什么来管理 DataSource 而不是直接管理控件的行集合?

总的来说,我如何改进我正在做的事情以获得更高的效率?

【问题讨论】:

  • 使用正确的DataTypes 为列创建一个DataTable,将您的行添加到DataTable,然后将其设置为.DataSource 到表中。
  • 而不是 DataTable - 为数据创建 DGVItem 类并使用 List(Of DGVitem) 或 BindingList。将它们用作 DGV 数据源。在这种情况下,数据表没有任何优势。请注意,无论你做什么,你都需要重写你的 MoveUp/Dn 方法(我开始在另一个问题上提出这个建议,但是......)
  • @Plutonix 我同意无论如何创建一个类。如果您不介意,为什么 DataTable 没有优势,为什么?如果您不介意我问,为什么类和列表比 DataTable 更好?此外,我会亲自使用字典,因此如果需要,我可以轻松更新,使用列表时没有键/值可查看...
  • @436f6465786572,我的意思是 DT 比 List 和 Class 没有优势。 DT 会起作用。你可能不知道的是the other aspect of this。使用 List 比处理 DT、DT.RowsCollection 等要容易得多
  • 您的 Up/Dn 代码只需稍作调整即可与 List/Collection 一起正常工作(主要将 rows 更改为 dgvList)。如果您使用 DT,那么您最终也将不得不将数据片段找出来,无论它们是如何使用的。如果数据来自数据库并返回那里,DT 会很棒(比列表更好),但事实并非如此。

标签: .net vb.net winforms datagridview datatable


【解决方案1】:

what can I do to manage a DataSource instead of directlly manage the rows collection of the control

一个类和一个集合很容易实现为DataSource,也很容易为它修改你的MoveUp/Dn方法。

Class DGVItem
    Public Property Index As Integer
    Public Property Name As String
    Public Property Color As String

    ' this will make the up/dn method simpler
    Public Property Selected As Boolean

    Public Sub New(i As Integer, n As String, v As String)
        Index = i
        Name = n
        Color = v
    End Sub

    Public Overrides Function ToString() As String
        Return String.Format("{0} ({1})", Name, Index)
    End Function

End Class

' collection source:
Private dgvList As BindingList(Of DGVItem)

用项目填充集合后,将其设置为 DGV 的DataSource

...
dgvList.Add(New DGVItem(ndx, filename, Compression.Default))
...
myDGV.DataSource = dgvList

您还需要告诉 DGV 在哪一列中显示哪个属性。 DGV 将 AutoGenerateColumns,但您可能已经使用 Designer (IDE) 创建了一些。打开列编辑器,对于每一列,找到 DataPropertyName 并输入要在该列中显示的项目属性名称。例如,第 0 列将是 IndexOrder。如果您不为新的 Selected 属性添加列,它将不会显示。

如果您让 DGV 从 DataSource 自动创建列,则在将源绑定到控件后,您可以删除任何不需要的列(例如 Selected)。请注意,它会创建列,但不会命名它们。

此时,您将利用 DGV 的“视图”方面 - 它显示其他地方包含的数据。因此,您不再操作 DGV 行(例如 MoveRow Up/Dn 或删除行) - 这将导致错误。相反,您管理 BindingList - 对它的更改将自动显示在 DGV 中。

最后,请注意,当用户执行编辑时,DGV 将更新BindingList 内容。如果他们为项目 3 选择不同的压缩,dgvList(2).Compression 将为您更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-06
    • 1970-01-01
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    相关资源
    最近更新 更多