我正在创建自己的使用Devexpress xtraTreeList
的用户控件。控件在非绑定模式下工作,并通过readXML()
获取数据;
我想以最灵活和正确的方式设置数据字段。
我现在所做的是InitData();
方法,我用这样的硬编码列填充数据源:
private DataTable dt;
public MbsTreeList()
{
InitializeComponent();
InitData();
}
private void InitData()
{
dt = new DataTable();
dt.Columns.Add("eventID", typeof(Int32));
dt.Columns.Add("parentID", typeof(Int32));
dt.Columns.Add("name", typeof(string));
dt.Columns.Add("startTime", typeof(string));
dt.Columns.Add("duration",typeof(string));
dt.Columns.Add("status", typeof(string));
dt.Columns.Add("timedByUser", typeof(bool));
dt.Columns.Add("eventType", typeof(Int32));
}
这是一个好习惯还是完全错误,有更好的方法吗?
答案 0 :(得分:0)
最好根据您的XML架构创建一个类,使用XML中的值填充List<YourClass>
并使用此List<YourClass>
代替DataTable
:
DataTable是.NET 1.0(IIRC)中引入的过渡API,以提供帮助 人们使用ADO记录集迁移COM代码。那远远超过了 十年前。使用DataTable的好方案几乎没有 今天(主要的一个是如果你正在编写一个不是的工具 模式绑定,就像ad-hoc查询工具,如数据资源管理器)。只是 关于任何替代方案都是远远可取的。列表,例如 - 由ORM或微ORM填充。 ©Marc Gravell♦
您可以自己创建课程或使用Class from XML generator 例如,如果你有这样的XML文件:
<MyClass>
<eventID>1</eventID>
<parentID>0</parentID>
<name>Some name</name>
<startTime>Some startTime</startTime>
<duration>Some duration</duration>
<status>Some status</status>
<timedByUser>true</timedByUser>
<eventType>1</eventType>
</MyClass>
它会生成这个类:
/// <remarks/>
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class MyClass
{
private byte eventIDField;
private byte parentIDField;
private string nameField;
private string startTimeField;
private string durationField;
private string statusField;
private bool timedByUserField;
private byte eventTypeField;
/// <remarks/>
public byte eventID
{
get
{
return this.eventIDField;
}
set
{
this.eventIDField = value;
}
}
/// <remarks/>
public byte parentID
{
get
{
return this.parentIDField;
}
set
{
this.parentIDField = value;
}
}
/// <remarks/>
public string name
{
get
{
return this.nameField;
}
set
{
this.nameField = value;
}
}
/// <remarks/>
public string startTime
{
get
{
return this.startTimeField;
}
set
{
this.startTimeField = value;
}
}
/// <remarks/>
public string duration
{
get
{
return this.durationField;
}
set
{
this.durationField = value;
}
}
/// <remarks/>
public string status
{
get
{
return this.statusField;
}
set
{
this.statusField = value;
}
}
/// <remarks/>
public bool timedByUser
{
get
{
return this.timedByUserField;
}
set
{
this.timedByUserField = value;
}
}
/// <remarks/>
public byte eventType
{
get
{
return this.eventTypeField;
}
set
{
this.eventTypeField = value;
}
}
}
现在您只需要将某些属性和字段的类型更改为适当的类型
要按值填充List<MyClass>
,您可以使用XmlSerializer
类或LINQ
以下是LINQ
的示例:
string xml = @"
<MyClass>
<eventID>1</eventID>
<parentID>0</parentID>
<name>Some name</name>
<startTime>Some startTime</startTime>
<duration>Some duration</duration>
<status>Some status</status>
<timedByUser>true</timedByUser>
<eventType>1</eventType>
</MyClass>
<MyClass>
<eventID>2</eventID>
<parentID>0</parentID>
<name>Some another name</name>
<startTime>Some another startTime</startTime>
<duration>Some another duration</duration>
<status>Some another status</status>
<timedByUser>false</timedByUser>
<eventType>2</eventType>
</MyClass>";
var doc = XDocument.Parse(xml);
var dataSource = doc.Elements("MyClass")
.Select<XElement, MyClass>(
(item) =>
{
var myClass = new MyClass();
myClass.eventID = int.Parse(item.Element("eventID").Value);
myClass.parentID = int.Parse(item.Element("parentID").Value);
myClass.name = item.Element("name").Value;
myClass.startTime = item.Element("startTime").Value;
myClass.duration = item.Element("duration").Value;
myClass.status = item.Element("status").Value;
myClass.timedByUser = bool.Parse(item.Element("timedByUser").Value);
myClass.eventType = int.Parse(item.Element("eventType").Value);
return myClass;
})
.ToList<MyClass>();
现在,您可以将此dataSource
变量用于您的目的。