Автоматически генерировать datagridviewcomboboxcolumn для свойства enum в DataSet - PullRequest
2 голосов
/ 19 октября 2011

Расстраиваюсь, ища ответы часами на этом ...

У меня есть файл .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 с Datagridview, логическое значение «Enabled» автоматически представляется в виде флажка.Как сделать так, чтобы столбец «Тип» автоматически представлял собой комбинированный столбец с раскрывающимся списком типов перечислений?

В Интернете я нашел несколько других ответов, но ни один из них не подходит для моего сценария.Если мне придется изменить порядок вещей (т. Е. Использовать строго типизированный набор данных), то, я думаю, я это сделаю, но я бы хотел, чтобы он работал с кодом как есть.

Большое спасибо ...

1 Ответ

0 голосов
/ 19 ноября 2011

проблема в том, что для вашего набора данных этот столбец не является перечислением, а является строкой ...

набор данных будет счастливо игнорировать это ограничение перечисления ...

вы можете убедиться, что, если вы попросите свои 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, идентифицируйте столбцы enum, создайте строковые массивы с соответствующими значениями и предоставьте их в качестве источника данных для комбинированных списков ...

я бы пошел для строго типизированных наборов данных ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...