改进DataGridView行管理

时间:2015-06-16 12:40:07

标签: .net vb.net winforms datagridview datatable

  

SCENARIO

我手动使用 DataGridViewRow 集合填充 DataGridView

enter image description here

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

  • 第一列采用整数值,其为DataGridViewTextBoxColumn
  • 第二列采用图标对象,其为DataGridViewImageColumn
  • 第三列采用字符串值,其为DataGridViewTextBoxColumn
  • 第四个采用字符串值,其为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而不是直接管理控件的行集合?

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

1 个答案:

答案 0 :(得分:2)

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并输入要在该列中显示的Item属性名称。例如,Col 0将是IndexOrder。如果您没有为新的Selected属性添加列,则不会显示。

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

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

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