【问题标题】:Best practice for data properties when creating an unbound usercontrol [closed]创建未绑定用户控件时数据属性的最佳实践[关闭]
【发布时间】:2014-07-24 18:27:42
【问题描述】:

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

这是一种好的做法,还是完全错误的做法?有更好的方法吗?

【问题讨论】:

    标签: c# .net winforms devexpress


    【解决方案1】:

    最好根据您的 XML 架构创建一个类,用 XML 中的值填充 List<YourClass> 并使用此 List<YourClass> 而不是 DataTable

    DataTable 是 .NET 1.0 (IIRC) 中引入的过渡 API,用于帮助 人们使用 ADO 记录集迁移出 COM 代码。那远远超过了 十年前。使用 DataTable 的好场景非常少 今天(主要是如果你正在编写一个不是 模式绑定,如临时查询工具,如数据资源管理器)。只是 关于任何替代方案都远非常可取。一个列表,例如 - 由 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&lt;MyClass&gt;,您可以使用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 变量用于您的目的。

    【讨论】:

    • 感谢nempoBu4的详细解答!我将不得不对列表和序列化做一些实验!并且还没有完全获得使用数据表的优势。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 2013-09-13
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多