创建未绑定的usercontrol时数据属性的最佳实践

时间:2014-07-24 18:27:42

标签: c# .net winforms devexpress

我正在创建自己的使用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));            
}

这是一个好习惯还是完全错误,有更好的方法吗?

1 个答案:

答案 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变量用于您的目的。