使用对象作为DataGridViewRow

时间:2014-08-22 12:07:26

标签: vb.net object inheritance datagridview

假设我有一个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

我想你了解我想要实现的目标,有什么建议吗?

2 个答案:

答案 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