自定义控件(15)给ListView添加编辑功能

来源:互联网 发布:java enum引用对象 编辑:程序博客网 时间:2024/06/06 15:37

上一遍文章定义的ListView支持单向绑定功能,也就是把数据库的数据显示到网页上。

接下来我们给ListView定义修改数据库数据的功能。这篇我们先定义编辑功能。

先看看效果


点击编辑转换到编辑模板


控件代码(红色为新加的代码,黄色为修改的代码)

using System;using System.Collections;using System.Collections.Generic;using System.Collections.Specialized;using System.ComponentModel;using System.Linq;using System.Text;using System.Web.UI;using System.Web.UI.WebControls;using System.Windows.Forms;namespace PZY.BLL.Web.SimpleListView{    public class SimpleListView : CompositeDataBoundControl    {        protected override HtmlTextWriterTag TagKey        {            get { return HtmlTextWriterTag.Ul; }        }        /// <summary>        /// 编辑列的index        /// </summary>        int _editIndex = -1;        [Category("Default"), DefaultValue(-1)]        public int EditIndex        {            get            {                return _editIndex;            }            set            {                _editIndex = value;            }        }        private ITemplate _itemTemplate;        [TemplateContainer(typeof(ListViewItem))]        [PersistenceMode(PersistenceMode.InnerProperty)]        [Browsable(false)]        [EditorBrowsable(EditorBrowsableState.Advanced)]        public ITemplate ItemTemplate        {            get { return _itemTemplate; }            set { _itemTemplate = value; }        }        //编辑模板        private ITemplate _editTemplate;        [TemplateContainer(typeof(ListViewItem), BindingDirection.TwoWay)]        [PersistenceMode(PersistenceMode.InnerProperty)]        [Browsable(false)]        [EditorBrowsable(EditorBrowsableState.Advanced)]        public ITemplate EditTemplate        {            get { return _editTemplate; }            set { _editTemplate = value; }        }        //编辑事件        #region  event        private static readonly object EventEditCommand = new object();        [Category("Action")]        public event EventHandler<ListViewArgument> EditCommand        {            add            {                base.Events.AddHandler(EventEditCommand, value);            }            remove            {                base.Events.RemoveHandler(EventEditCommand, value);            }        }        protected virtual void OnEditCommand(ListViewArgument e)        {            EventHandler<ListViewArgument> handler = (EventHandler<ListViewArgument>)base.Events[EventEditCommand];            if (handler != null)            {                handler(this, e);            }        }        #endregion                #region Handle events        /// <summary>        /// 控件冒泡事件        /// 在模板列中点击的事件会冒泡到这里        /// </summary>        /// <param name="source"></param>        /// <param name="args"></param>        /// <returns></returns>        protected override bool OnBubbleEvent(object source, EventArgs args)        {            bool handled = false;            if (args is CommandEventArgs)            {                CommandEventArgs cmdArgs = args as CommandEventArgs;                 if (cmdArgs.CommandName.Equals("Edit", StringComparison.OrdinalIgnoreCase))                {                    ListViewArgument e = new ListViewArgument((ListViewItem)source);                    HandleEdit(e);                    handled = true;                }            }            return handled;        }        /// <summary>        /// 编辑事件        /// </summary>        /// <param name="e"></param>        void HandleEdit(ListViewArgument e)        {            //if (GetData().CanUpdate)            //{                EditIndex = e.Item.DataItemIndex;                RequiresDataBinding = true;                OnEditCommand(e);            //}            //else            //{            //    throw new InvalidOperationException("数据源不支持更新");            //}        }        #endregion        protected override int CreateChildControls(IEnumerable dataSource, bool dataBinding)        {            int index = 0;            Controls.Clear();            if (ItemTemplate != null)            {                //数据库中每行数据                foreach (object dataItem in dataSource)                {                    ListViewItem listViewItem = new ListViewItem(dataItem, index, index);                    if (index == EditIndex)                    {                        if (_editTemplate != null)                        {                            _editTemplate.InstantiateIn(listViewItem);                        }                    }                    else                    {                        _itemTemplate.InstantiateIn(listViewItem);                    }                    Controls.Add(listViewItem);                    index++;                }                //绑定                DataBind(false);                ChildControlsCreated = true;            }            return index;        }    }    /// <summary>    /// 定义模板    /// </summary>    [ToolboxItem(false)]    public class ListViewItem : WebControl, IDataItemContainer    {        private object _dataItem;        private int _index;        private int _displayIndex;        #region IDataItemContainer 成员        public object DataItem        {            get { return _dataItem; }        }        public int DataItemIndex        {            get { return _index; }        }        public int DisplayIndex        {            get { return _displayIndex; }        }        #endregion        protected override HtmlTextWriterTag TagKey        {            get { return HtmlTextWriterTag.Li; }        }        public ListViewItem()        {        }        public ListViewItem(object dataItem, int index, int displayIndex)        {            this._dataItem = dataItem;            this._index = index;            this._displayIndex = displayIndex;        }        /// <summary>        /// 冒泡事件(会冒泡到SimpleListView的OnBubbleEvent事件)        /// </summary>        /// <param name="source"></param>        /// <param name="args"></param>        /// <returns></returns>        protected override bool OnBubbleEvent(object source, EventArgs args)        {            if (source is System.Web.UI.WebControls.IButtonControl)            {                CommandEventArgs cmdArgs = args as CommandEventArgs;                if (cmdArgs != null)                {                    CommandEventArgs cmdArg = new CommandEventArgs(cmdArgs.CommandName, this.DataItemIndex.ToString());                    RaiseBubbleEvent(this, cmdArg);                    return true;                }            }            return false;        }    }    /// <summary>    /// 定义事件参数    /// </summary>    public class ListViewArgument : EventArgs    {        private ListViewItem _item;        public ListViewItem Item        {            get { return _item; }            set { _item = value; }        }        public ListViewArgument()        {        }        public ListViewArgument(ListViewItem item)        {            _item = item;        }    }}

html代码

<div>                <cc1:SimpleListView ID="SimpleListView1" DataSourceID="sdsProducts" runat="server">                    <ItemTemplate>                        <div>                            ISDN:                            <asp:Label ID="ISDNLabel" runat="server" Text='<%# Eval("id") %>'></asp:Label>                            Title:                            <asp:Label ID="TitleLabel" runat="server" Text='<%# Eval("name") %>'></asp:Label>                            Author:                            <asp:Label ID="AuthorLabel" runat="server" Text='<%# Eval("sort") %>'></asp:Label>                            <asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="False" CommandName="Edit"                                Text="编辑" />                        </div>                    </ItemTemplate>                    <EditTemplate>                        ProductID:                        <asp:Label ID="ProductIDLabel1" runat="server" Text='<%# Eval("Id") %>'></asp:Label>                        ProductName:                        <asp:TextBox ID="ProductNameTextBox" runat="server" Text='<%# Bind("Name") %>'>                        </asp:TextBox>                        UnitPrice:                        <asp:TextBox ID="UnitPriceTextBox" runat="server" Text='<%# Bind("sort") %>'>                        </asp:TextBox>                    </EditTemplate>                </cc1:SimpleListView>                <asp:SqlDataSource ID="sdsProducts" runat="server" ConnectionString="<%$ ConnectionStrings:myConn %>"                    OldValuesParameterFormatString="original_{0}" SelectCommand="select Id,Name,Sort from ArticleType">                    <UpdateParameters>                        <asp:Parameter Name="Id" />                        <asp:Parameter Name="Name" />                        <asp:Parameter Name="Sort" />                    </UpdateParameters>                </asp:SqlDataSource>            </div>



阅读全文
0 0