• 回复 寒枫天伤 PSP 的问题


          今天收到“寒枫天伤 - PSP”的问题(老大,名字能不能简单点,好难打也),询问载体设计的问题,乱谈一下吧,不好你当胡扯蛋了。

    载体的设计有俩个思路,一个是表格式的,一个是层次的。

          ms的ADO、DataSet就是表格式的,采用行、列组成的表,然后表集合之间建立联系。他更贴近关系型数据库的结构,因此使用简单、可以充分利用已经成熟的大量研究成果。缺点就是他是抽象的,不直观。

          通常的xml和O/R的设计就是层次的,局部来说也是行(集合)、列(属性)组成表(对象),区别是表(对象)之间不是平等的关系,而是建立了有点像树一样的结构。好处吗,编写代码的时候看着舒服些罗(不是我打击你),缺点吗,一沓子了,我最头大的是数据跟踪问题。

          我无法在一片文章中说明所有的事情,例如序列化、继承原则、CRUD、数据跟踪一大堆要处理的事情。

          先说说 IBindList和ICancelAddNew接口吧,IBindList是列表绑定的基础接口,他继承于IList接口,如果你想绑定到某个表格或者列表中,IList基本上够了(实际上数组和ICollection也可以),但IBindList提供是否能新增、编辑和删除的选项,还提供排序、查找等功能(我可没有实现这个复杂的功能,我使用表格本身的功能),最重要的是他提供了ListChanged事件,这个是你通知外界你的集合发生改变的最好途径,所以你的集合最好是实现IBindList,而不紧紧是IList。

          ICancelAddNew接口用在表格的编辑中,你使用表格的时候都知道你新建一行的时候可以按ESC键取消新建,实际内部的工作原理是:已经新建了行并添加到行集合,当你按ESC时,删除掉刚才的一行,所以你必须记住刚才新建的行是第多少行。 (如果没有记错的话,.net 1.1是没有这个接口的 ,.net 2.0才有)

          下面的代码是部分的集合代码(不能运行的),不要以为我能写多好的程序,其实我是抄System.ComponentModel.Collections.Generic.BindingList<T>的。


    Using directives

    namespace Mango.Common.Data
    {
        
    /// <summary> 行集合对象的基础类 </summary>
        public class DataRowCollectionBase : CollectionBase, IBindingList, IList, ICollection, IEnumerable, ICancelAddNew
        
    {
            
    // Fields
            private int addNewPos;
            
    private bool hookingItems;
            
    private PropertyChangedEventHandler onItemPropertyChanged;
            
    private bool allowNew;
            
    private bool allowEdit;
            
    private bool allowRemove;

            
    private Type _itemType;
            
    private object _parent;

            
    // Events
            public event AddingNewEventHandler AddingNew;
            
    public event ListChangedEventHandler ListChanged;

            
    类的初始化方法

            
    AddNew相关方法

            
    ListChanged事件的支持

            
    Clear相关方法

            
    Remove相关方法

            
    Set相关方法

            
    ICancelAddNew支持

            
    集合是否可以改动的支持

            
    排序和查询功能的支持
        }

    }

  • 相关阅读:
    将一个全是字母的字符串转化为大写
    将一个全是字母,以0结尾的字符串,转化为大写
    call指令和ret指令的配合使用
    将一个全是字母,以0结尾的字符串,转化为大写
    《那些年啊,那些事——一个程序员的奋斗史》——45
    《那些年啊,那些事——一个程序员的奋斗史》——46
    《那些年啊,那些事——一个程序员的奋斗史》——44
    《那些年啊,那些事——一个程序员的奋斗史》——44
    《那些年啊,那些事——一个程序员的奋斗史》——44
    《那些年啊,那些事——一个程序员的奋斗史》——43
  • 原文地址:https://www.cnblogs.com/tansm/p/88922.html
Copyright © 2020-2023  润新知