.net 改进DataGridView行管理
情景 我正在用DataGridViewRow集合手动填充DataGridView: 我在设计时在VisualStudio的GUI生成器中创建了这些列.net 改进DataGridView行管理,.net,vb.net,winforms,datagridview,datatable,.net,Vb.net,Winforms,Datagridview,Datatable,情景 我正在用DataGridViewRow集合手动填充DataGridView: 我在设计时在VisualStudio的GUI生成器中创建了这些列 第一列取一个整数值,它是一个DataGridViewTextBoxColumn 第二列接受一个图标对象,它是一个DataGridViewImageColumn 第三列接受一个字符串值,它是一个DataGridViewTextBoxColumn 第四个接受一个字符串值,它是一个DataGridViewComboBoxColumn 因此,当我要添
- 第一列取一个整数值,它是一个
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的这种交互,我只想先使用和管理数据源
,然后如何创建一个数据表
,该表采用与控件的数据源
相同类型的值来设置它?。可能吗
如果不是,我该如何管理数据源
,而不是直接管理控件的行集合
一般来说,如何改进我正在做的工作以获得更好的效率?
如何管理数据源而不是直接管理控件的行集合
类和集合很容易实现为数据源
,修改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的数据源
:
...
dgvList.Add(New DGVItem(ndx, filename, Compression.Default))
...
myDGV.DataSource = dgvList
您还需要告诉DGV在哪个列中显示哪个特性。DGV将自动生成列
,但您可能已经使用设计器(IDE)创建了一些。打开列编辑器,找到每个列的DataPropertyName
,然后键入要在该列中显示的项属性名称。例如,列0将是索引
或顺序
。如果不为新的选定属性添加列,它将不会显示
如果允许DGV从数据源自动创建列
,则在将源绑定到控件后,可以删除任何不需要的列(例如所选
)。请注意,它将创建列,但不会命名它们
此时,您将利用DGV的“视图”特性—它显示其他地方包含的数据。因此,您不再操作DGV行(例如MoveRow Up/Dn或删除行),这将导致错误。而是管理绑定列表
——对其所做的更改将自动显示在DGV中
最后,请注意,当用户执行编辑时,DGV将更新BindingList
内容。如果他们为项目3选择了不同的压缩,dgvList(2)。将为您更新压缩 为列创建具有正确数据类型的DataTable
,将行添加到DataTable
,然后将其设置为。DataSource
到表中。而不是DataTable-为数据创建DGVItem类,并使用列表(DGVItem)
或绑定列表。将它们用作DGV数据源。在这种情况下,数据表没有任何优势。请注意,无论您做什么,您都需要重写MoveUp/Dn方法(我开始建议在另一个问题上,但是…)@Proputix我完全同意创建一个类。如果您不介意,为什么数据表没有优势,为什么?如果你不介意我问的话,为什么类和列表比数据表更好?此外,我个人会使用字典,以便在需要时可以轻松更新,当使用列表时,没有要查看的键/值…@436f6465786572,我的意思是DT比列表和类没有优势。一个DT就行了。你可能不知道的是。使用列表要比处理DT、DT.RowsCollection等容易得多。Up/Dn的代码只需稍加调整(主要是将行
更改为dgvList
)就可以很好地处理列表/集合。如果您使用DT,您还将不得不从中提取数据片段,以确定它们是如何使用的。如果数据来自DB并返回到DB,则DT将非常好(优于列表),但事实并非如此。