public void AddData(int prototype, object data)
        {
            InitPrototypes();
            Element ele = new Element(prototype);

            ele.size = SizeOfPrototype(prototype);
            ele.data = data;
            if (mFirst == null)
            {
                mFirst     = ele;
                mResize    = true;
                mResizeRow = mFirstRow;
                mLast      = ele;
                return;
            }
            if (m_SortData)
            {
                var node = mLast;
                while (node != null)
                {
                    if (CompareData(node, ele) < 0)
                    {
                        break;
                    }
                    node = node.previous;
                }
                if (node == null)
                {
                    mFirst.AddBefore(ele);
                    mResize    = true;
                    mResizeRow = null;
                    mFirst     = ele;
                }
                else
                {
                    node.AddAfter(ele);
                    if (node == mLast)
                    {
                        mLast = ele;
                    }
                    mResize = true;
                    if (node.row == null)
                    {
                        mResizeRow = null;
                    }
                    else if (mResizeRow == null || mResizeRow.index > node.row.index)
                    {
                        mResizeRow = node.row;
                    }
                }
            }
            else
            {
                mLast.AddAfter(ele);
                mLast      = ele;
                mResize    = true;
                mResizeRow = mLastRow;
            }
        }
        public void BindData <T>(IEnumerable <T> iter) where T : class
        {
            InitPrototypes();
            int p = GetPrototype <T>();

            if (p == -1)
            {
                return;
            }
            Vector2 size = SizeOfPrototype(p);

            ClearData();
            var it = iter.GetEnumerator();

            //Element node = null;
            if (m_SortData)
            {
                while (it.MoveNext())
                {
                    var ele = new Element(p);
                    ele.data = it.Current;
                    ele.size = size;
                    if (mLast == null)
                    {
                        mFirst = ele;
                        mLast  = ele;
                    }
                    else
                    {
                        var prev = mLast;
                        while (prev != null)
                        {
                            if (CompareData(prev, ele) <= 0)
                            {
                                break;
                            }
                            prev = prev.previous;
                        }
                        if (prev == null)
                        {
                            ele.AddAfter(mFirst);
                            mFirst = ele;
                        }
                        else
                        {
                            prev.AddAfter(ele);
                            if (prev == mLast)
                            {
                                mLast = ele;
                            }
                        }
                    }
                }
            }
            else
            {
                while (it.MoveNext())
                {
                    Element ele = new Element(p);
                    ele.data = it.Current;
                    ele.size = size;
                    if (mFirst == null)
                    {
                        mFirst = ele;
                        mLast  = ele;
                    }
                    else
                    {
                        mLast.AddAfter(ele);
                        mLast = ele;
                    }
                }
            }
            mResize    = true;
            mResizeRow = null;
        }