需要一些关于将数据放入 vb.Net 中的 DataGridView 的建议

Posted

技术标签:

【中文标题】需要一些关于将数据放入 vb.Net 中的 DataGridView 的建议【英文标题】:Need some advice on putting data into DataGridView in vb.Net 【发布时间】:2011-08-19 03:30:09 【问题描述】:

我需要一些关于在 Visual Basic .Net 中操作 DataGridView 的建议。这是我第一次玩 DataGridView。我的程序是加载一个 .txt 文件,其中包含建筑物中每个房间的数据,并将它们显示在 DataGridView 中。

这是显示 2 个房间的文件的一部分:

1;1812;1812;F18;T1;26808.16;.00;.00;.00;.00;.00;.00;
1;1813;1813;F18;T1;24000.00;3500.00;.00;300.00;.00;.00;.00

房间是一个以结束符结尾的单行字符串。

我在加载文件和获取所有这些信息方面没有问题。我将每个房间的数据存储到 Room 类的对象中,并将它们放在一个列表中。

现在,我将房间的所有属性放入数据网格的列中,如下所示:

现在,如何将所有这些房间的数据放入网格中?我起初尝试关注http://www.dotnetperls.com/datagridview-vbnet,但是将 DataSource 设置为从给定链接模仿的 Room 类列表不会在网格视图中显示任何内容。我们如何告诉程序将网格的行链接到对象列表?还是我做错了?

因此,任何建议都值得赞赏。我们如何做到这一点?

【问题讨论】:

【参考方案1】:

您的问题是您使用设计器创建列,然后没有将DataSource 属性链接到这些列。

您发布的链接是关于根据作为对象列表的 DataSource 自动生成列,在该链接中,它们不会在设计器中创建列,而是依赖于 AutoGenerateColumns 属性设置为 true对于DataGridView

有一个论坛帖子here 讨论了您需要做什么。在MSDN上也有很好的描述。

基本上,您需要为每一列设置DataPropertyName 以匹配您的对象所需的属性。

所以如果你的对象看起来像:

class Room

    public string RoomName() get; set;

您需要在网格设计器中将房间名称列的DataPropertyName 属性设置为RoomName

【讨论】:

【参考方案2】:

我想您会惊喜地发现使用 BindingSources 和 Visual Studio 可以轻松做到这一点。

    创建你的房间类(我想已经完成了) 构建您的项目

    将您的类设置为 DGV 的数据源:

    单击 DGV 的智能标记(或 DGV 属性表中的 DataSource 字段)并在“选择数据源”下拉菜单中选择“添加项目数据源...” 在“数据源配置向导”中选择对象并单击下一步 导航程序集的类结构以选择您在步骤 1 中创建的类,然后单击下一步 单击完成关闭向导

    您会注意到一个新的 BindingSource 已添加到您的项目中。您将使用此 BindingSource 将您的房间对象列表绑定到您的 DGV。填写 List 的房间后,您的代码将如下所示:

    roomBindingSource.DataSource = roomList
    

请注意,您将从没有列的 DataGridView 开始。执行上述步骤后,您的 DGV 将根据您要绑定的类中字段的可访问性填充列。此时您可以自定义列的外观,例如包括删除/添加等。

【讨论】:

谢谢,它有效。但唯一的问题是我无法在列表中添加新行。表格中没有添加任何新内容,但我已通过使用 RoomBindingSource.Add( ... ) 和 RoomGridView.DataSource = RoomBindingSource 来加载文件并使用 RoomBindingSource.AddNew() 来添加新房间 @Karl 当您说“列表”时,您是指列表,集合吗?如果是这样,您应该可以执行 yourList.Add(listItem)。 不,这对我不起作用。当我 roomList.add(new Room()) 时,RoomGridView 似乎没有得到新项目。 @Karl 抱歉,我的回复不完整。添加新项目后,您需要重新绑定 BindingSource:RoomBindingSource.DataSource = NothingRoomBindingSource.DataSource = RoomList【参考方案3】:

公开课表1

Private Sub Form1_Load(ByVal sender As System.Object, _
           ByVal e As System.EventArgs) Handles MyBase.Load
' Uses Test class from above.
Dim list = New List(Of Test)
list.Add(New Test("Mac", 2200))
list.Add(New Test("PC", 1100))
DataGridView1.DataSource = list
End Sub

Private Sub DataGridView1_SelectionChanged(ByVal sender As System.Object, _
                       ByVal e As System.EventArgs) _
                       Handles DataGridView1.SelectionChanged
' Get the current cell location.
Dim y As Integer = DataGridView1.CurrentCellAddress.Y
Dim x As Integer = DataGridView1.CurrentCellAddress.X

' Write coordinates to console.
Console.WriteLine(y.ToString + " " + x.ToString)
End Sub

结束类

【讨论】:

以上是关于需要一些关于将数据放入 vb.Net 中的 DataGridView 的建议的主要内容,如果未能解决你的问题,请参考以下文章

带有MS访问数据库作为后端的VB.NET如何通过将数据库文件放入AppData文件夹进行部署?

VB.Net 中的类命名决策

关于VB.NET2005中dataGridView的问题

具有许多数据库调用的 VB.net 多线程

VB.NET:将 CSV 文件读入二维数组

我应该在这个 VB.NET 应用程序中使用啥数据库?