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

时间:2011-10-18 23:13:00

标签: 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看起来像这样(由我的类Variable和VariableList上的xsd.exe生成):

<?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绑定到Datagridview时,布尔值“Enabled”会自动用checkboxcolumn表示。如何让“类型”列自动成为带有枚举类型下拉列表的组合框?

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

非常感谢......

1 个答案:

答案 0 :(得分:0)

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

数据集很乐意忽略枚举限制...

如果你问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,识别枚举列,用适当的值构建字符串数组,并将它们作为组合框的数据源提供......

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