Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 什么';对我来说,将数据绑定到DataGridView的最佳方式是什么?_C#_Xml_Winforms_Data Binding - Fatal编程技术网

C# 什么';对我来说,将数据绑定到DataGridView的最佳方式是什么?

C# 什么';对我来说,将数据绑定到DataGridView的最佳方式是什么?,c#,xml,winforms,data-binding,C#,Xml,Winforms,Data Binding,我对C#(来自Java背景)非常陌生,我正在开发一个表单,以快速管理不同的数据(例如用户、域、计算机),并提供使用数据的实用程序 为避免混淆,以下是示例数据结构的摘要 <User> <Name>joe</Name> <Domain>europa</Domain> </User> <Domain> <Name>europa<Name> <Domain> &

我对C#(来自Java背景)非常陌生,我正在开发一个
表单
,以快速管理不同的数据(例如用户、域、计算机),并提供使用数据的实用程序

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

<User> <Name>joe</Name> <Domain>europa</Domain> </User> <Domain> <Name>europa<Name> <Domain> <Domain> <Name>group</Name> </Domain> <Computer> <Name>localhost</Name> </Computer> 这对于域和计算机
DataGridViews
来说工作正常,因为它们只有映射到名称属性的单个文本列。但是,用户
DataGridView
的域列是一个组合框,我需要它包含所有可能的域(例如europa、group)以及绑定到User.Domain的所选域(以及最初选择的User.Domain)

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

  • 我假设对
    DataGridView
    所做的更改在我从构建的输出目录读取时会立即保存在底层XML文件中。这是正确的还是需要额外的配置/过程
  • 在我尝试让它工作的过程中,我尝试使用
    DataRelation
    ,如下所示; DataRelation dataRelation = new DataRelation("Domain users", dataSet.Tables["Domain"].Columns["Domain"], dataSet.Tables["User"].Columns["Domain"]); dataSet.Relations.Add(dataRelation); DataRelation DataRelation=新的DataRelation(“域用户”, dataSet.Tables[“域”]。Columns[“域”], dataSet.Tables[“User”]。Columns[“Domain”]); dataSet.Relations.Add(datarelations);
    DataRelations
    究竟是如何工作的,它们会产生什么影响
  • 为了帮助您理解/解释我使用SharpDevelop IDE开发此应用程序


    提前感谢。

    您已经发现,
    DataGridView
    功能非常强大,大部分工作都是以自动方式完成的。不幸的是,如果这些默认值与您的首选项不匹配(例如使用文本属性的组合框),您就会遇到问题

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

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

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

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

    要将具体数据与DataGridView连接,只需将表应用于绑定源

    在运行时执行相同的操作 如果您使用了Visual Studio并遵循了上述步骤,那么您可以随后轻松查看Designer.cs文件,以了解Visual Studio是如何完成所有工作的。您也可以手动执行任何操作。所以如果你需要的话

    只需创建一个
    DataGridViewComboxColumn
    ,设置
    DataPropertyName
    HeaderText
    ,您就有了一个很好的起点。获取要替换的列的
    IndexOf()
    索引,将其删除,然后在所需位置插入新创建的列

    在网格显示某些数据(在ComboBoxColumn中)之前,您需要提供一个包含可能值的列表。为此,comboBoxColumn本身有一个DataSource属性,您可以在其中提供所需的值。对于最简单的场景,您只需提供一个
    i集合
    ,但也可以提供更复杂的内容,如
    列表
    。如果是这种情况,您还应该设置属性
    ValueMember
    DisplayMember
    ,告诉组合框应该使用对象的哪些属性来填充列表


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

    这些看起来都非常有用。明天我会尝试将这个逻辑应用到我的应用程序中,并让您知道它是如何运行的。此外,SharpDevelop对于像我这样的穷人来说是Visual Studio的开源等价物:),并且具有几乎所有相同的功能。@Alasdair:对于穷人来说,也存在同样的功能。我已经尝试过了,但我现在不确定我是否了解类(例如用户、域)的使用方式。可能是SharpDevelop在视觉上不支持它,但我甚至看不到如何将类绑定到“BindingSource”。你能提供上述所有的代码示例吗?@Oliver:我以前试过,但无法生成可执行文件,并且仅限于.application build输出。现在不是这样吗?如果没有,我很乐意再试一次。特别是如果它有助于解决这个问题的话。@Alasdair:据我所知,2008 Express的局限性在于没有插件支持和多语言支持(解决方案不能容纳VB和C#项目)。在2010年,Express仍然存在单一语言限制,但现在可以支持外接程序。其他一切都是可能的,没有任何问题。 DataRelation dataRelation = new DataRelation("Domain users", dataSet.Tables["Domain"].Columns["Domain"], dataSet.Tables["User"].Columns["Domain"]); dataSet.Relations.Add(dataRelation);