Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 改进DataGridView行管理_.net_Vb.net_Winforms_Datagridview_Datatable - Fatal编程技术网

.net 改进DataGridView行管理

.net 改进DataGridView行管理,.net,vb.net,winforms,datagridview,datatable,.net,Vb.net,Winforms,Datagridview,Datatable,情景 我正在用DataGridViewRow集合手动填充DataGridView: 我在设计时在VisualStudio的GUI生成器中创建了这些列 第一列取一个整数值,它是一个DataGridViewTextBoxColumn 第二列接受一个图标对象,它是一个DataGridViewImageColumn 第三列接受一个字符串值,它是一个DataGridViewTextBoxColumn 第四个接受一个字符串值,它是一个DataGridViewComboBoxColumn 因此,当我要添

情景

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

我在设计时在VisualStudio的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的这种交互,我只想先使用和管理
数据源
,然后如何创建一个
数据表
,该表采用与控件的
数据源
相同类型的值来设置它?。可能吗

如果不是,我该如何管理
数据源
,而不是直接管理控件的行集合


一般来说,如何改进我正在做的工作以获得更好的效率?

如何管理数据源而不是直接管理控件的行集合

类和集合很容易实现为
数据源
,修改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将非常好(优于列表),但事实并非如此。