c# - 为DataSet中的枚举属性自动生成datagridviewcomboboxcolumn

标签 c# xml datagridview xsd dataset

在这个问题上寻找几个小时的答案感到沮丧......

我有一个 .xml 文件,我将其反序列化为 DataSet,还有一个 .xsd,因此数据集的类型是已知的。像这样:

 mDataSetVariables = new DataSet();
 using (var rdr = new StringReader(Properties.Resources.VariableListSchema))
 {
     mDataSetVariables.ReadXmlSchema(rdr);
 }
 mDataSetVariables.ReadXml(filename, XmlReadMode.ReadSchema);

 dataGridView_Params.Columns.Clear();
 dataGridView_Params.DataSource = mDataSetVariables;
 dataGridView_Params.DataMember = "Variable";

.xml 文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<VariableList xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <List>
    <Variable>
      <Name>kPeakPeriodAccThresh</Name>
      <Type>FixedPoint</Type>
      <Min>0.0001</Min>
      <Max>0.02</Max>
      <InitialValue>0.003</InitialValue>
      <BestValue>0.0052570276796268427</BestValue>
      <CurrentValue>0.006459431678617374</CurrentValue>
      <Enabled>true</Enabled>
    </Variable>
    < ... more variables here >

.xsd 看起来像这样(由 xsd.exe 在我的 Variable 和 VariableList 类型的类上生成):

<?xml version="1.0" encoding="utf-8"?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="VariableList" nillable="true" type="VariableList" />
  <xs:complexType name="VariableList">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="1" name="List" type="ArrayOfVariable" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="ArrayOfVariable">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="unbounded" name="Variable" nillable="true" type="Variable" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="Variable">
    <xs:sequence>
      <xs:element minOccurs="0" maxOccurs="1" name="Name" type="xs:string" />
      <xs:element minOccurs="1" maxOccurs="1" name="Type" type="VariableType" />
      <xs:element minOccurs="1" maxOccurs="1" name="Min" type="xs:double" />
      <xs:element minOccurs="1" maxOccurs="1" name="Max" type="xs:double" />
      <xs:element minOccurs="1" maxOccurs="1" name="InitialValue" type="xs:double" />
      <xs:element minOccurs="1" maxOccurs="1" name="BestValue" type="xs:double" />
      <xs:element minOccurs="1" maxOccurs="1" name="CurrentValue" type="xs:double" />
      <xs:element minOccurs="1" maxOccurs="1" name="Enabled" type="xs:boolean" />
    </xs:sequence>
  </xs:complexType>
  <xs:simpleType name="VariableType">
    <xs:restriction base="xs:string">
      <xs:enumeration value="Integer" />
      <xs:enumeration value="FixedPoint" />
      <xs:enumeration value="Boolean" />
    </xs:restriction>
  </xs:simpleType>
</xs:schema>

当我将 DataSet 绑定(bind)到 Datagridview 时, bool 值“Enabled”自动用 checkboxcolumn 表示。如何让“类型”列自动成为带有枚举类型下拉列表的组合框列?

我在网上找到了其他几个答案,但似乎没有一个适合我的情况。如果我必须更改事物的排列方式(即使用强类型数据集),那么我想我会的,但我希望它按原样使用代码。

非常感谢...

最佳答案

问题是,就您的数据集而言,该列不是枚举而是字符串 ...

数据集会很高兴地忽略枚举限制......

如果您向 mDataSetVariables 请求 getXmlSchema(),您可以验证这一点
注意

的变化
<xs:simpleType name="VariableType">
  <xs:restriction base="xs:string">
    <xs:enumeration value="Integer" />
    <xs:enumeration value="FixedPoint" />
    <xs:enumeration value="Boolean" />
</xs:restriction>

  <xs:simpleType name="VariableType">
    <xs:restriction base="xs:string" />
  </xs:simpleType>

要处理这个问题,您必须自己解析 xsd,识别枚举列,构建具有适当值的字符串数组,并将它们作为组合框的数据源提供...

我会选择强类型数据集......

关于c# - 为DataSet中的枚举属性自动生成datagridviewcomboboxcolumn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7814864/

相关文章:

java - Android - findViewById(int id) 始终返回 null

c# - 如何围绕异步方法编写包装器?

c# - 基于在 asp.net 中丢失的文本框焦点更新更新面板

c# - 磁贴在 WP8.1 Silverlight 应用程序中未正确显示

Python:如何使用 xml.dom.minidom 获取 XML 元素的文本内容?

C# MySql如何将存储过程与dataGridView绑定(bind)

c# - 在某些计算机上,应用程序无法加载 sqlite dll 文件

java - 从jar中读取xml文件的问题

c# - 如果 GridView 中不存在则添加值(行)

c# - Winforms 绑定(bind)源问题添加新记录