假设我有一个Person类,其名称,电话,电子邮件和一个名为selected的bool。 这些人是通过半冒号分隔的文本文件生成的。 我循环文件并获取每个人的值。使用"使用"在DataGridView中显示它们的最佳做法是什么? (&#34的复选框;已选择"),"名称"和"电子邮件"? (注意我离开了电话) 就像现在一样,我在Person类中有一个名为MakeDataGridRow的函数,我使用这样的东西:
For each line blah blah StreamReader(filename) blah...
Dim P as New Person(line.split(";"))
MyDataGridview.Rows.Add(P.MakeDataGridRow)
End For
这样可行,但这并不是很好,因为当我想对列表做某事时,我必须循环列表并为每个选中的行生成一个新的Person,对吧?在这种情况下,我无法获取电话号码,因为它不在列表中。我可以将它们保存在一个人的列表中(在文件读取循环中)并检查每个选定的行以反映此列表以获取电话,但我不喜欢这个解决方案。
好的解决方案是,如果Person类继承DataGridViewRow,那么当我循环我的行时,我可以使用已经创建的人来检查电话号码。我该怎么做呢?
有点像:
Public Class Person
Inherits DataGridViewRow
Public Name As String
Public Telephone as String
Public Email As String
Public Selected As Boolean
Public Sub New(ByVal Values As String())
Name = Values(0)
Telephone = Values(1)
Email = Values(2)
Selected = True
End Sub
End Class
我如何将这个类显示为DataGridView中的一行,以便稍后,当我对这些人做一些事情时,我可以做更多的事情
For Each P as Person In MyDataGridView.Rows
If P.Selected Then
MsgBox(P.Name & ", telephone: " & P.Telephone)
End If
End For
我想你了解我想要实现的目标,有什么建议吗?
答案 0 :(得分:1)
继承DataGridViewRow
并没有给你带来任何实际好处。我认为最好的解决方案是创建一个List
Person
,其中包含您从CSV文件中获取的所有数据。
然后将列表绑定到DataGridView,如
MyDataGridView.BindingSource = MyListPersons
当您想显示数字时,只需循环选定的行,使用CType
获取基础对象(Person
对象)并显示您的手机。
这会将dgv行转换为Person对象
Dim p As Person = CType(row.DataBoundItem, Person)
If p IsNot Nothing Then
MsgBox(p.Name & ", telephone: " & p.Telephone)
End If
答案 1 :(得分:1)
不,将它们视为两个独立的对象。不要从DataGridViewRow继承您的Person类。
一个。从Person类定义中删除Inherits DataGridViewRow
。
B中。在Person类中,将所有字段转换为属性。根据您使用的.net版本,将Property
关键字添加到声明中就足够了,或者您可能必须放置完整的属性定义。
℃。现在它可以轻松地数据绑定到网格。 (您可以指定固定列。我只是在此示例中自动生成)
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' create a new list of Persons. THis will act as datasource for the gridview.
Dim personsList As New List(Of Person)
' fill data into the list.
' *I skip the implementation of this part, you already have that code*
' bind the persons list to the Grid view.
DataGridView1.AutoGenerateColumns = True
DataGridView1.DataSource = personsList
' hide unwanted columns
DataGridView1.Columns("Email").Visible = False
End Sub
d。现在,您可以轻松地从中获取您的人物对象和任何内容。例如获取电话号码:
Private Function GetPhoneNumber(ByVal rowNumber As Integer) As String
Return DirectCast(DataGridView1.Rows(rowNumber).DataBoundItem, Person).Telephone
End Function