【问题标题】:What's the best way for me to bind data to a DataGridView?我将数据绑定到 DataGridView 的最佳方式是什么?
【发布时间】:2011-02-02 14:23:59
【问题描述】:

我是 C# 的新手(来自 Java 背景),我正在使用Form 来快速管理不同的数据(例如用户、域、计算机)以及提供使用这些数据的实用程序。

为避免混淆,以下是示例数据结构的摘要;

乔姓名> 欧洲域> 用户> 欧罗巴 组名称> 域> 本地主机名称> 电脑>

在我的Form 中,每个数据都有标签页,每个标签页都包含一个DataGridView(包含每个成员的列),以便于管理。当Form Load 事件被触发时,我使用单个DataSet 从XML 文件(使用模式)读取数据。读取数据后,我使用代码将表格设置为各自DataGridViewDataSource

userDataGridView.DataSource = dataSet.Tables["User"]; domainDataGridView.DataSource = dataSet.Tables["Domain"]; computerDataGridView.DataSource = dataSet.Tables["计算机"];

这适用于域和计算机DataGridViews,因为它们只有单个文本列映射到名称属性。但是,用户DataGridView 的域列是一个组合框,我需要它包含所有可能的域(例如欧罗巴、组)以及绑定到 User.Domain 的选定域(也就是 User.Domain)。最初选择的域)。

我的主要问题是我如何实现上述目标,但我还有一些其他问题希望有人能回答;

  1. 我假设当我从构建的输出目录读取它时,对DataGridView 所做的更改会立即保留在底层 XML 文件中。这是正确的还是需要额外的配置/流程?
  2. 在尝试让它工作的过程中,我尝试使用DataRelation,如下所示; DataRelation dataRelation = new DataRelation("域用户", dataSet.Tables["Domain"].Columns["Domain"], dataSet.Tables["User"].Columns["Domain"]); dataSet.Relations.Add(dataRelation); DataRelations 究竟是如何工作的,它们有什么/可以产生什么影响?

如果它可以帮助您理解/解释我正在使用 SharpDevelop IDE 来处理这个应用程序。

提前致谢。

【问题讨论】:

    标签: c# xml winforms data-binding


    【解决方案1】:

    正如您已经发现的那样,DataGridView 非常强大,并且以自动方式完成大部分工作。不幸的是,如果这些默认值与您的偏好不匹配(例如使用 ComboBox 作为文本属性),您会遇到问题。

    要将DataGridViewComboBoxColumn 放到正确的位置,您可以在代码中以编程方式执行此操作,或者(如果可能)与设计器一起执行(在 Visual Studio 中不知道 SharpDevelop 是否支持它)。

    使用 (Visual Studio) 设计器

    对于这种情况,有必要在设计时通过提供一个将所有(或更多)信息作为简单属性(如具有属性名称、年龄等的人员类)的类来了解数据的结构。如果可用,您可以将BindingSource 添加到您的控件中,然后在属性窗口中单击DataSource 属性旁边的按钮。选择添加项目数据源并选择对象并选择您想要的对象。

    现在您有了一个配置了特定类型数据源的绑定源。接下来选择您的 DataGridView 并将 DataSource 属性更改为最近创建的绑定源。

    在此之后,DataGridView 将自动为每个属性填充一列。现在您可以轻松进入 Columns 属性,并根据需要更改每列的行为和类型。

    要将您的具体数据与 DataGridView 连接,只需将您的表应用到绑定源。

    在运行时做同样的事情

    如果您有 Visual Studio 并按照上述步骤操作,那么之后您可以轻松查看 Designer.cs 文件,了解 Visual Studio 是如何完成所有这些工作的。没有什么是你不能手动做的。因此,如果您需要这样做。

    只需创建一个DataGridViewComboBoxColumn,设置DataPropertyNameHeaderText,您就有了一个很好的起点。获取IndexOf()您要替换的列,将其删除,然后将Insert()您新创建的列放在您想要的位置。

    在 Grid 可以显示一些数据之前(在 ComboBoxColumn 中),您需要提供一个包含可能值的列表。为此,comboBoxColumn 本身有一个 DataSource 属性,您可以在其中提供所需的值。在最简单的情况下,您只需提供ICollection<string>,但您也可以提供更复杂的内容,例如List<KeyValuePair<Enum, string>>。如果是这种情况,您还应该设置属性 ValueMemberDisplayMember 来告诉 ComboBox 应该使用对象的哪些属性来填充列表。

    也许有了这些信息,你应该看看MSDN article about the DataGridViewComboBoxColumn 并研究这个例子。这应该会给你一些关于如何正确设置的额外提示。

    【讨论】:

    • 这一切看起来都非常有用。明天我将尝试将此逻辑应用于我的应用程序,并让您知道它是如何进行的。此外,对于像我这样的穷人来说,SharpDevelop 是 Visual Studio 的 OpenSource 等价物 :) 并且具有几乎所有相同的功能。
    • @Alasdair:对于穷人来说,还有Visual Studio Express Edition
    • 我已经尝试过了,但现在我不确定我是否理解类(例如用户、域)的使用方式。可能是 SharpDevelop 在视觉上不支持它,但我什至看不到如何将类绑定到“BindingSource”。你能提供以上所有的代码示例吗?
    • @Oliver:我之前尝试过,但无法构建可执行文件并且仅限于 .application 构建输出。现在还不是这样吗?如果没有,我会很高兴再试一次。特别是如果它有助于解决这个问题。
    • @Alasdair:据我所知,2008 Express 的限制是不支持加载项和不支持多语言(解决方案不能容纳 VB 和 C# 项目)。在 2010 年,Express 仍然存在单一语言限制,但现在可以支持插件。其他一切皆有可能,没有任何问题。
    猜你喜欢
    • 2014-02-02
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    • 2018-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多