C#存取数据为所欲为(三)

      今天迟到了---天气啊,什么时候能暖和点儿啊,我就纳了闷了,为什么上海的天气预报

还没有我们家乡的准呢,说下雨却是阴天,说多云偏偏大风大雨,昨天说天晴结果居然下点

儿雪了~~~~!房东又来了,又得掏一大笔银子啊-------

       废话少说!还是来正经的要紧。。。。

       接着昨天的聊,我们了解了当条记录是如何操作的就好办了,现在来说记录集的具体操

作,这节内容稍稍有些难,需要知道.NET泛型和泛型约束(这里我就不说了),还有几个原

始集合类的接口实现和继承关系------

        其实对于记录集操作,我最偏向于继承.NET 原始集合类,因为它本身就集成了很多

功能,足以让我们应付很多问题,还可override很多虚拟方法,多好!!

OK! 说做就做,如下:

    [Serializable]
    
public abstract class TableCollection<T> : Collection<T>
        
where T : TableItem
    {
      
    }

这个抽象类自己实际要做的事情就是  1,判断Tableitem的IsDirty,IsNew,IsDeleted;

2,提交数据(对于集合而言,还没有到DB层)或返回数据至集合中。所以有代码:

        public void AcceptChanges()
        {
            
// 提交
            Collection<T> itemsToDelete = new Collection<T>();
            
foreach (T item in this.AllItems())
            {
                
if (item.IsDeleted)
                {
                    
// 等待删除
                    itemsToDelete.Add(item);
                }
                
else
                {
                    
// 恢复状态
                    item.AcceptChanges();
                }
            }

            
// 最后从collcection中移除
            foreach (T item in itemsToDelete)
            {
                
base.RemoveItem(IndexOf(item));
            }
        }

        
public void RejectChanges()
        {
            
// 返回
            Collection<T> itemsToDelete = new Collection<T>();
            
foreach (T item in this.AllItems())
            {
                
if (item.IsNew)
                {
                    
// 准备要删的记录
                    itemsToDelete.Add(item);
                }
                
else
                {
                    
// 单条记录返回
                    item.RejectChanges();
                }
            }

            
// 删除新增加的记录
            foreach (T item in itemsToDelete)
            {
                
base.RemoveItem(IndexOf(item));
            }
        }

        
protected override void RemoveItem(int index)
        {
            
// 做个删除标记
            this[index].Delete();
        }

对如删除记录,为什么只做标记呢?很简单,假如在这里就彻底删了,最后TODB要删怎么办,没有了where后

面得条件就无法删了。其他就没有什么可说了,说明也很清楚^_^

上面代码中的this.AllItems()是不是很奇怪??就是获得整个集合的items,代码如下:

        public IEnumerable<T> AllItems()
        {
            
return this;
        }

关键的在下面的代码中,我们要重新来实现GetEnumerator(),因为我们不是要所有的item , 而是选取我们所需

要的item :

        public new IEnumerator<T> GetEnumerator()
        {
            
foreach (T item in this.AllItems())
            {
                
if (!item.IsDeleted)
                {
                    
yield return item;
                }
            }
        }

OK,这个抽象类要做的实事就是这些了,这个家伙事做多了总是不爽,老想着要分点事儿给儿子做,不想让儿子吃

现成的!!这不,说着就来了 :

        public TableCollection(bool loadData)
        {
            
if (loadData)
            {
                Load();
            }
        }
        
//实际的继承类去实现
        public abstract void Load();

那儿子怎么去做父亲交代的事儿呢,欲知如何,下回分解^_^^_^

原文地址:https://www.cnblogs.com/Mayvar/p/wanghonghua.html