写了一个控件,显示效果如上。第一次页面打开可以正常显示,点击按钮回发后页面数据清空了,近段时间刚研究不久,
找了一上午问题,谢各位
namespace NewDataList
{
    public class DataList : WebControl,INamingContainer
    {
        string _dataKeyField;
        IEnumerable _dataSource;
        ITemplate _itemTemplate;
        int _topQuantity;
        int _botRepeatColumn;
        string _recommendKeyField;
        string _imageKeyField;
        string _imagePath;
        string _imageHeight;
        string _imageWidth;              protected override void CreateChildControls()
        {
            Controls.Clear();
            if (ViewState["_ItemCount"] != null)
                CreateControlHierarchy(false);            if (IsTrackingViewState)
                TrackViewState();
        }        protected override void OnDataBinding(EventArgs e)
        {
            base.OnDataBinding(e);
            Controls.Clear();            if (HasChildViewState)
                ClearChildViewState();            CreateControlHierarchy(true);
            ChildControlsCreated = true;
            if (IsTrackingViewState)
                TrackViewState();
        }        protected void CreateControlHierarchy(bool useDataSource)
        {
            IEnumerable data;
            IEnumerator dataItems;
            int itemCount;
            int itemCounter = 0;            if (!useDataSource)
            {
                itemCount = (int)ViewState["_ItemCount"];
                data = new DummyDataSource(itemCount);
            }
            else
            {
                data = DataSource;
            }
            dataItems = data.GetEnumerator();            ArrayList list = new ArrayList();
            ArrayList list2 = new ArrayList();
            while (dataItems.MoveNext())//获得信息集合
            {
                //判断当前是否为推荐图片
                if (dataItems.Current != null)
                {
                    string recommend = DataBinder.GetPropertyValue(dataItems.Current, _recommendKeyField).ToString().Trim();
                    if (recommend == "0")
                        list.Add(dataItems.Current);
                    else
                        list2.Add(dataItems.Current);
                }
                itemCounter++;
            }            //填充图片表格
            Table imgTable = new Table();
            imgTable.ID = "imgTable";
            imgTable.Width = Unit.Parse("100%");
            imgTable.BorderWidth = Unit.Parse("0");
            imgTable.CellPadding = 0;
            imgTable.CellSpacing = 0;
            for (int i = 0; i < list2.Count; i++)
            {
                TableRow imgRow = new TableRow();
                DataListItem item = new DataListItem(list2[i]);
                TableCell imgCell = new TableCell();
                ItemTemplate.InstantiateIn(item);
                Image img = new Image();
                img.ImageUrl = ImagePath + "/" + DataBinder.GetPropertyValue(list2[i], ImageKeyField);
                img.Height = Unit.Parse(Height.ToString());
                img.Width = Unit.Parse(Width.ToString());
                imgCell.Controls.Add(img);
                imgRow.Cells.Add(imgCell);
                imgTable.Rows.Add(imgRow);
                item.TrackViewState();
            }            Table topTable = new Table();
            topTable.ID = "topTable";
            topTable.Width = Unit.Parse("100%");
            topTable.BorderWidth = Unit.Parse("0");
            topTable.CellPadding = 0;
            topTable.CellSpacing = 0;
            ArrayList topList = new ArrayList();            Table botTable = new Table();
            botTable.ID = "botTable";
            botTable.Width = Unit.Parse("100%");
            botTable.BorderWidth = Unit.Parse("0");
            botTable.CellPadding = 0;
            botTable.CellSpacing = 0;
            ArrayList botList = new ArrayList();            for (int i = 0; i < _topQuantity; i++)
            {
                if (list[i] != null)
                    topList.Add(list[i]);
            }            for (int i = _topQuantity; i < list.Count; i++)
            {
                if (list[i] != null)
                    botList.Add(list[i]);
            }            //分为两步,首先填充顶部表格,再次填充底部表格
            for (int i = 0; i < topList.Count; i++)
            {
                DataListItem item = new DataListItem(topList[i]);
                TableRow topRow = new TableRow();
                TableCell topCell = new TableCell();
                topCell.Width = Unit.Parse("100%");
                ItemTemplate.InstantiateIn(item);
                topCell.Controls.Add(item);
                topRow.Cells.Add(topCell);
                topTable.Rows.Add(topRow);
            }            for (int i = 0; i < botList.Count;)
            {
                TableRow botRow = new TableRow();
                for (int k = 0; k < _botRepeatColumn; k++)
                {
                    if (i >= list.Count - 1)
                        break;
                    TableCell botCell = new TableCell();
                    botCell.Width = Unit.Parse(Math.Round(Convert.ToDouble(100 / _botRepeatColumn)) + "%");
                    DataListItem item = new DataListItem(botList[i]);
                    ItemTemplate.InstantiateIn(item);
                    botCell.Controls.Add(item);
                    item.TrackViewState();
                    botRow.Cells.Add(botCell);
                    i = i + 1;
                }
                botTable.Rows.Add(botRow);
            }
            //创建主表格
            Table mainTable = new Table();
            mainTable.ID = "mainTable";
            mainTable.Width = Unit.Parse("100%");
            mainTable.BorderWidth = Unit.Parse("0");
            mainTable.CellPadding = 0;
            mainTable.CellSpacing = 0;            TableRow mainRow = new TableRow();
            TableCell mainCell = new TableCell();
            //======================添加小表
                            Table sTable = new Table();
                            sTable.ID = "sTable";
                            sTable.Width = Unit.Parse("100%");
                            sTable.BorderWidth = Unit.Parse("0");
                            sTable.CellPadding = 0;
                            sTable.CellSpacing = 0;
                            TableRow sRow = new TableRow();
                            TableCell sCell = new TableCell();
                            sCell.Width = Unit.Parse("40%");
                            sCell.Style["valign"] = "top";
                            sCell.Style["align"] = "left";
                            sCell.Controls.Add(imgTable);
                            TableCell sCell2 = new TableCell();
                            sCell2.Width = Unit.Parse("60%");
                            sCell2.Controls.Add(topTable);
                            sRow.Cells.Add(sCell);
                            sRow.Cells.Add(sCell2);
                            sTable.Rows.Add(sRow);            mainCell.Controls.Add(sTable);
            mainRow.Cells.Add(mainCell);            TableRow mainRow2 = new TableRow();
            TableCell mainCell2 = new TableCell();
            mainCell2.Controls.Add(botTable);
            mainRow2.Cells.Add(mainCell2);
            mainTable.Rows.Add(mainRow);
            mainTable.Rows.Add(mainRow2);            if (useDataSource)
                ViewState["_ItemCount"] = itemCounter;            Controls.Add(mainTable);
        }
    }    

解决方案 »

  1.   

    public class DataListItem : WebControl, INamingContainer
        {
            object _dataItem;
            public DataListItem(object dataItem)
            {
                _dataItem = dataItem;
            }        public object DataItem
            {
                get { return _dataItem; }
                set { _dataItem = value; }
            }        internal new void TrackViewState()
            {
                base.TrackViewState();
            }
        }    internal sealed class DummyDataSource : IEnumerable
        {
            private int dataItemCount;        public DummyDataSource(int dataItemCount)
            {
                this.dataItemCount = dataItemCount;
            }        public IEnumerator GetEnumerator()
            {
                return new DummyDataSourceEnumerator(dataItemCount);
            }        private class DummyDataSourceEnumerator : IEnumerator
            {
                private int count;
                private int index;            public DummyDataSourceEnumerator(int count)
                {
                    this.count = count;
                    this.index = -1;
                }
                public object Current
                {
                    get { return null; }
                }
                public bool MoveNext()
                {
                    index++;
                    return index < count;
                }
                public void Reset()
                {
                    this.index = -1;
                }
            }
        }
    }分两次发
      

  2.   

    在調用的時候應該放在page.ispoback里面
      

  3.   

    我没有仔细看你的代码,所以很难回答你的问题。谈两点看法:在设计aspx、ascx之初就在页面上放置一个button,在关键时刻总是点击它来测试控件状态保持的机制是否正确,我只一直强调这是保证asp.net编程基本正确的关键测试技术(它保证你的程序基本上是独立和完整的生命期控制,而不是一旦跟别的控件协作在别的控件回发时自己反而垮了)。今天看到了几个blog里边专门讲动态添加模板列之列的功能,拿出“范例”代码来写一个测试页面,用这个简单的button一测试,再回发时范例程序根本就不保持状态,可见设计上一定有着严重的漏洞。通常比较可取的办法是,每当新写一点代码,例如5分钟吧,就要使用这个button测试一下,从一开始就保证基本的asp.net生命期模型控制正确,不要等到最后才来找问题。但是很遗憾,我觉得你的代码实在是太多了,我看着头疼。我觉得你完全可以把95%以上的代码删除,变为在xhtml设计代码。使用声明风格,要比写代码逻辑清楚,开发速度快很多倍,关键是调试、改进也很方便,也更容易直接跟asp.net的其它框架融合起来(当你手写过多的代码,很可能不经意间采取了极端狭隘难以融合的设计方法)。你的程序,也许最多只需要写6、7行有意义的代码,甚至更少的代码,就可以了。那时候,为什么会出现你说的问题,往往也是一目了然的。
      

  4.   

    根据我说的第一条,我建议你把你的代码按照开发逻辑“回退”,也是就是把大部分功能注释掉,仅留下最少最基本的几条代码,然后经受这个button回发测试,找出问题所在。
      

  5.   

    是哦。想写试试那种不同版面的数据绑定。其实可以完全换成HTML来写的。嘿嘿。总归学了用用。所以就用这种了。到最后
    调起来确实太麻烦了。看着头都晕了。正想着法换种方式来写。后期真用了维护确实是问题。