public class myListView : CompositeDataBoundControl,INamingContainer 
    {
         private int editIndex = -1;
        [Category("Default"), DefaultValue(-1)]
        public int EditIndex
        {
            get { return editIndex; }
            set { editIndex = value; }
        }        //public int EditIndex
        //{
        //    get
        //    {
        //        if (ViewState["EditIndex"] == null)
        //        {
        //            return -1;
        //        }
        //        return (int)ViewState["EditIndex"];
        //    }
        //    set { ViewState["EditIndex"] = value; }
        //}        #region 模板
        private ITemplate itemTemplate;
        [TemplateContainer(typeof(myListViewItem)), PersistenceMode(PersistenceMode.InnerProperty)]
        public ITemplate ItemTemplate
        {
            get { return itemTemplate; }
            set { itemTemplate = value; }
        }        private ITemplate editTemplate;
        [TemplateContainer(typeof(myListViewItem), BindingDirection.TwoWay), PersistenceMode(PersistenceMode.InnerProperty)]
        public ITemplate EditTemplate
        {
            get { return editTemplate; }
            set { editTemplate = value; }
        }
        #endregion        protected override int CreateChildControls(System.Collections.IEnumerable dataSource, bool dataBinding)
        {
            int index = 0;
            if (dataBinding)
            {            }
            if (ItemTemplate != null)
            {
                Controls.Clear();
                foreach (object dataItem in dataSource)
                {
                    myListViewItem myItem = new myListViewItem(dataItem, index, index);
                    if (EditIndex == index)
                    {
                        if (EditTemplate != null)
                        {
                            EditTemplate.InstantiateIn(myItem);
                        }
                    }
                    else
                    {                      
                        ItemTemplate.InstantiateIn(myItem);
                    }
                    index++;
                    Controls.Add(myItem);
                }
            }
            DataBind(false);
            ChildControlsCreated = true;
            return index;
        }        protected override HtmlTextWriterTag TagKey
        {
            get
            {
                return HtmlTextWriterTag.Ul;
            }
        }        protected override bool OnBubbleEvent(object source, EventArgs args)
        {
            bool handle = false;
            if (args is CommandEventArgs)
            {
                CommandEventArgs myargs = args as CommandEventArgs;
                switch (myargs.CommandName.ToUpper())
                {
                    case "EDIT":
                        EditIndex = int.Parse( myargs.CommandArgument.ToString());
                        RequiresDataBinding = true;
                        handle=true;
                        break;
                    case "UPDATE":
                        break;
                    case "CANCEL":
                        EditIndex = -1;
                        RequiresDataBinding = true;
                        handle = true;
                        break;
                    default:
                        break;
                }
            }
            return handle;
        }
    }[ToolboxItem(false)]
    public  class myListViewItem:WebControl,INamingContainer,IDataItemContainer
    {
        private object dataItem;
        private int dataIndex;
        private int index;
        public myListViewItem()
        {        }        public myListViewItem(object dataItem, int dataIndex, int index)
        {
            this.dataItem = dataItem;
            this.dataIndex = dataIndex;
            this.index = index;
        }        #region IDataItemContainer 成员        public object DataItem
        {
            get { return dataItem; }
        }        public int DataItemIndex
        {
            get { return dataIndex; }
        }        public int DisplayIndex
        {
            get { return index; }
        }        #endregion
        protected override HtmlTextWriterTag TagKey
        {
            get
            {
                return HtmlTextWriterTag.Li;
            }
        }        protected override bool OnBubbleEvent(object source, EventArgs args)
        {
            if (source is IButtonControl)
            {
                CommandEventArgs e = args as CommandEventArgs;
                if (e != null)
                {
                    CommandEventArgs myargs = new CommandEventArgs(e.CommandName, this.dataIndex.ToString());
                    base.RaiseBubbleEvent(this, myargs);
                    return true;
                }
            }
            return false;
        }
    }
 <lv:myListView ID="myList" runat="server" DataSourceID="SqlDataSource1">
            <ItemTemplate>
                uid:
                <asp:Label ID="uidLabel" runat="server" Text='<%# Eval("uid") %>'></asp:Label><br />
                username:
                <asp:Label ID="usernameLabel" runat="server" Text='<%# Bind("username") %>'></asp:Label><br />
                nickname:
                <asp:Label ID="nicknameLabel" runat="server" Text='<%# Bind("nickname") %>'></asp:Label><br />
                <asp:LinkButton ID="EditButton" runat="server"  CommandName="Edit"
                    Text="编辑">
                </asp:LinkButton>
            </ItemTemplate>
            <EditTemplate>
                uid:
                <asp:Label ID="uidLabel1" runat="server" Text='<%# Eval("uid") %>'></asp:Label><br />
                username:
                <asp:TextBox ID="usernameTextBox" runat="server" Text='<%# Bind("username") %>'></asp:TextBox><br />
                nickname:
                <asp:TextBox ID="nicknameTextBox" runat="server" Text='<%# Bind("nickname") %>'></asp:TextBox><br />
                <asp:Button ID="aa" runat="server" Text="update"  CommandName="update"/>
               <asp:Button ID="bb" runat="server" Text="cancel"  CommandName="cancel"/>
            </EditTemplate>
        </lv:myListView>
发现一个奇怪问题  当没有EditIndex属性没有加viewstate时,cancel和update都不会调用OnBubbleEvent事件,
EditIndex属性加了viewstate时,cancel和update会调用OnBubbleEvent事件
大家帮忙看看这是什么原因,找了几天了也没找到 ,非常感谢

解决方案 »

  1.   

    这个是正常的,服务器端依赖的就是ViewState做状态保持的。不过你可以使用控件状态(ControlState),通过重写下面的方法就可以实现:
        protected override object SaveControlState()
        {
            return base.SaveControlState();
        }    protected override void LoadControlState(object savedState)
        {
            base.LoadControlState(savedState);
        }控件状态(ControlState)可以在禁用了ViewState时,依然有效。
      

  2.   

    不是  你没理解我意思 

     public int EditIndex
            {
                get { return editIndex; }
                set { editIndex = value; }
            }
    这个改成下面的时 
            //public int EditIndex
            //{
            //    get
            //    {
            //        if (ViewState["EditIndex"] == null)
            //        {
            //            return -1;
            //        }
            //        return (int)ViewState["EditIndex"];
            //    }
            //    set { ViewState["EditIndex"] = value; }
            //}cancel和update会调用OnBubbleEvent事件
    否则不会调用OnBubbleEvent事件
      

  3.   

    是这样的
    如果EditIndex没有保存在ViewState中,当页面在编辑状态下,按cancel或update回发,
    这时候控件初始化,EditIndex初始化成-1,然后在CreateChildControls时,由于EditIndex=-1,
    所以所有行都实例化了成ItemTemplate,而取消和更新按钮是在EditTemplate中的,
    由于这两个按钮都没有再次被创建,所以它们对应的事件就被忽略了,自然也不能Bubble到NamingContainer
      

  4.   

    哎  这个问题弄了我两天了   一语惊醒梦中人啊  原来是EditTemplate没创建  牛人 谢罗
    但是我在道不远人这本书中 他也是这样写的但是可以触法OnBubbleEvent事件
    我只是把其中一部分代码贴出来了