回复 寒枫天伤 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支持

        
集合是否可以改动的支持

        
排序和查询功能的支持
    }

}

原文地址:https://www.cnblogs.com/tansm/p/88922.html