zoukankan      html  css  js  c++  java
  • 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();

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

  • 相关阅读:
    pcntl_fork 导致 MySQL server has gone away 解决方案
    视频网站 阻止迅雷劫持下载
    推荐大家使用的CSS书写规范、顺序
    console对象
    js Math函数
    致13级师弟师妹关于校招的一些话
    UVA514 铁轨 Rails:题解
    SP1805 HISTOGRA
    洛谷 P4363 [九省联考2018]一双木棋chess 题解
    比赛:大奔的方案solution
  • 原文地址:https://www.cnblogs.com/Mayvar/p/wanghonghua.html
Copyright © 2011-2022 走看看