将数据绑定到DataGridView的最佳方法是什么?

时间:2011-02-02 14:24:00

标签: c# xml winforms data-binding

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

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

<User>
    <Name>joe</Name>
    <Domain>europa</Domain>
</User>
<Domain>
    <Name>europa<Name>
<Domain>
<Domain>
    <Name>group</Name>
</Domain>
<Computer>
    <Name>localhost</Name>
</Computer>

在我的Form我有每个数据的标签页,每个标签包含DataGridView(包含每个成员的列),以便进行简单管理。我正在使用单个DataSet,当Form Load事件被触发时,它会从XML文件中读取数据(使用模式)。在阅读数据后,我使用代码将表格设置为各自DataSource的{​​{1}};

userDataGridView.DataSource = dataSet.Tables["User"];
domainDataGridView.DataSource = dataSet.Tables["Domain"];
computerDataGridView.DataSource = dataSet.Tables["Computer"];

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

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

  1. 我假设对DataGridView所做的更改会立即保留在基础XML文件中,因为我正在从构建的输出目录中读取它。这是正确的还是需要额外的配置/过程?
  2. 在尝试将其投入使用期间,我尝试使用DataGridView,如下所示;
    DataRelation dataRelation = new DataRelation("Domain users", 
        dataSet.Tables["Domain"].Columns["Domain"], 
        dataSet.Tables["User"].Columns["Domain"]);
    dataSet.Relations.Add(dataRelation);
    
    DataRelation究竟如何运作以及它们有什么作用?
  3. 如果它有助于您理解/解释我正在使用SharpDevelop IDE来处理此应用程序。

    提前致谢。

1 个答案:

答案 0 :(得分:2)

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

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

使用(Visual Studio)设计器

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

现在您有一个使用特定类型的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并研究一下这个例子。这应该给你一些关于如何正确设置它的额外提示。