SCENARIO
我手动使用 DataGridViewRow 集合填充 DataGridView :
我在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
而不是直接管理控件的行集合?
一般来说,我如何改进我正在做的事情以获得更高的效率?
答案 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将是Index
或Order
。如果您没有为新的Selected
属性添加列,则不会显示。
如果您将源代码绑定到控件后让DGV自动创建DataSource
中的列,则可以删除任何不需要的列(例如Selected
)。请注意,它将创建列,但不会命名它们。
此时,您将使用DGV的“视图”方面 - 它显示其他地方包含的数据。因此,您不再操纵DGV行(例如MoveRow Up / Dn或删除行) - 这将导致错误。而是管理BindingList
- 对它的更改将自动显示在DGV中。
最后,请注意,当用户执行编辑时,DGV将更新BindingList
内容。如果他们为第3项选择了不同的压缩,则会为您更新dgvList(2).Compression
。