mark新官上任,转贴一个DataGrid(增加删除确认和新增记录功能),道贺:)

发布时间: 2007-01-24 10:10    作者: 未知    来源: 未知    浏览:    评论

using System;
using System.Web.UI.WebControls;
using System.Data;


/*
*    The Control assumes the following:
*
*        1) It is bound to a DataView object.
*        2) The app will use direct SQL commands to update the source (NO batch update).
*        3) No custom paging is enabled.
*        
*      If you plan to support sorting, then some aspects of this code should be reviewed
*      and adapted.
*
*/

namespace BWSLib
{
    namespace Controls
    {
        public class EditableGrid : DataGrid
        {
            // Constructor that sets some styles and graphical properties    
            public EditableGrid()
            {
                AllowFullEditing = true;
                AddNewRow = false;
                RejectChanges = false;
                MustInsertRow = false;

                AllowPaging = true;

                // Handlers
                Init += new EventHandler(OnInit);
                PageIndexChanged += new DataGridPageChangedEventHandler(OnPageIndexChanged);

                ItemCreated += new DataGridItemEventHandler(OnItemCreated);
                CancelCommand += new DataGridCommandEventHandler(OnCancelCommand);
                EditCommand += new DataGridCommandEventHandler(OnEditCommand);
                UpdateCommand += new DataGridCommandEventHandler(OnUpdateCommand);
                DeleteCommand += new DataGridCommandEventHandler(OnDeleteCommand);
            }


            // PROPERTY: AllowFullEditing
            // Enable full editing
            public bool AllowFullEditing;

            // PROPERTY: AddNewRow
            // if true must add an empty row at the bottom of the data source
            public bool AddNewRow;
        
            // INTERNAL PROPERTY: RejectChanges
            // if true must reject changes on the last row of the data source
            protected bool RejectChanges;

            // INTERNAL PROPERTY: MustInsertRow
            // if true must INSERT instead of UPDATE and there's a pending change
            protected bool MustInsertRow
            {
                get {return Convert.ToBoolean(ViewState["MustInsertRow"]);}
                set {ViewState["MustInsertRow"] = value;}
            }


            // PROPERTY: DataSource (override)
            public override object DataSource
            {
                get {return base.DataSource;}
                set
                {    
                    base.DataSource = value;
                    if (AllowFullEditing)
                    {
                        if (AddNewRow)
                        {
                            AddNewRow = false;
                            InsertNewRow();
                        }

                        if (AllowFullEditing && RejectChanges)
                        {
                            RejectChanges = false;
                            MustInsertRow = false;
                            RejectChangesOnLastRow();
                        }
                    }
                }
            }

    
            // PROPERTY: command columns
            public bool ShowWebdings = false;
            public String EditColumnText = "Edit";
            public String EditColumnUpdateText = "OK";
            public String EditColumnCancelText = "Cancel";
            public String DeleteColumnText = "Delete";


            // EVENT: InitRow
            public delegate void DataGridInitRowEventHandler(Object sender, DataGridInitRowEventArgs e);
            public event DataGridInitRowEventHandler InitRow;
            private void OnInitRow(DataGridInitRowEventArgs e)
            {
                if (InitRow != null)
                    InitRow(this, e);
            }


            // EVENT: UpdateView
            public event EventHandler UpdateView;
            protected virtual void OnUpdateView(EventArgs e)
            {
                if (UpdateView != null)
                    UpdateView(this, e);
            }
        

            // EVENT: SaveData
            public event DataGridCommandEventHandler SaveData;
            protected virtual void OnSaveData(DataGridCommandEventArgs e)
            {
                if (SaveData != null)
                    SaveData(this, e);
            }
        
        
            // EVENT: InsertData
            public event DataGridCommandEventHandler InsertData;
            protected virtual void OnInsertData(DataGridCommandEventArgs e)
            {
                if (InsertData != null)
                    InsertData(this, e);
            }
        

            // EVENT: DeleteData
            public event DataGridCommandEventHandler DeleteData;
            protected virtual void OnDeleteData(DataGridCommandEventArgs e)
            {
                if (DeleteData != null)
                    DeleteData(this, e);
            }
        

        
            // EVENT HANDLER: Init
            public void OnInit(Object sender, EventArgs e)
            {
                if (AllowFullEditing)
                    AddWorkerColumns();
            }


            // EVENT HANDLER: ItemCreated
            public void OnItemCreated(Object sender, DataGridItemEventArgs e)
            {
                ListItemType lit = e.Item.ItemType;
                if (lit == ListItemType.Item || lit == ListItemType.AlternatingItem)
                    CustomizeItem(e);
            }


            // EVENT HANDLER: CancelCommand
            public void OnCancelCommand(Object sender, DataGridCommandEventArgs e)
            {
                if (e.Item.ItemIndex == 0)
                    CurrentPageIndex = (CurrentPageIndex==0 ?0 :CurrentPageIndex-1);

                // Clears edit mode
                EditItemIndex = -1;

                // Reject changes on the last row
                RejectChanges = true;

                // Show/Hide DELETE column
                ToggleDeleteColumn(true);

                // Refresh view
                OnUpdateView(EventArgs.Empty);
            }


            // EVENT HANDLER: EditCommand
            public void OnEditCommand(Object sender, DataGridCommandEventArgs e)
            {
                // Reject changes on the last row (if any)
                RejectChanges = true;

                // Show/Hide DELETE column
                ToggleDeleteColumn(false);

                // Enable editing on the clicked row
                EditItemIndex = e.Item.ItemIndex;

                // Refresh view
                OnUpdateView(EventArgs.Empty);
            }


            // EVENT HANDLER: UpdateCommand
            public void OnUpdateCommand(Object sender, DataGridCommandEventArgs e)
            {
                // Clear edit mode
                EditItemIndex = -1;

                // Show/Hide DELETE column
                ToggleDeleteColumn(true);

                // Reject changes on the last row
                RejectChanges = true;

                // Update or insert data
                if (MustInsertRow)
                    OnInsertData(e);
                else
                    OnSaveData(e);

                // Refresh view
                OnUpdateView(EventArgs.Empty);
            }
        

            // EVENT HANDLER: DeleteCommand
            public void OnDeleteCommand(Object sender, DataGridCommandEventArgs e)
            {
                // Clear edit mode
                EditItemIndex = -1;

                // Delete data
                OnDeleteData(e);

                // First item in the row, one page back
                if (Items.Count == 1)
                    CurrentPageIndex = (CurrentPageIndex==0 ?0 :CurrentPageIndex-1);

                // Refresh view
                OnUpdateView(EventArgs.Empty);
            }
        

            // EVENT HANDLER: PageIndexChanged
            public void OnPageIndexChanged(Object sender, DataGridPageChangedEventArgs e)
            {
                // Clears edit mode
                EditItemIndex = -1;

                // Reject changes on the last row
                RejectChanges = true;
            
                // Show/Hide DELETE column
                ToggleDeleteColumn(true);

                // Set the new page index
                CurrentPageIndex = e.NewPageIndex;

                // Refresh data
                OnUpdateView(EventArgs.Empty);
            }




        
            /* ---------------------------------------------------------------------*/
            /* ------------------------  INTERNALS ---------------------------------*/
            /* ---------------------------------------------------------------------*/


            // Reject changes on the last row
            private void RejectChangesOnLastRow()
            {
                // Get the underlying DataTable object
                DataTable dt = ((DataView) DataSource).Table;
                DataRow drLast = dt.Rows[dt.Rows.Count-1];
                if (drLast.RowState == DataRowState.Added)
                    drLast.RejectChanges();
            }



            // Show/Hide the DELETE column when in edit mode
            private void ToggleDeleteColumn(bool bViewState)
            {
                int nGridColCount = Columns.Count;
                Columns[nGridColCount-1].Visible = bViewState;
            }



            // Put the grid in edit mode by adding a blank row
            private void InsertNewRow()
            {
                // Show/Hide DELETE column
                ToggleDeleteColumn(false);

                // Get the underlying DataTable object
                DataTable dt = ((DataView) DataSource).Table;
            
                // If any pending changes, stop here...
                DataTable tmpTableOfPendingChanges = dt.GetChanges(DataRowState.Added);
                if (tmpTableOfPendingChanges != null)
                    return;

                // Add the new row
                DataRow row = dt.NewRow();
                dt.Rows.Add(row);

                // Initialize the row
                DataGridInitRowEventArgs dgire = new DataGridInitRowEventArgs();
                dgire.Row = row;
                OnInitRow(dgire);

                // Goto to last page (return last index in the page)
                int nNewItemIndex = SetIndexesToLastPage(dt);

                // Turn edit mode on for the newly added row
                EditItemIndex = nNewItemIndex;
            
                // Tracks that a new row has just been added
                MustInsertRow = true;
            }



            // Update indexes to point to last page
            private int SetIndexesToLastPage(DataTable dt)
            {
                int nRemainder = (dt.Rows.Count % PageSize);
                int nNewItemIndex = nRemainder;
                CurrentPageIndex = (dt.Rows.Count / PageSize)-1;    // 0-based
                if (CurrentPageIndex <0)
                    CurrentPageIndex = 0;
                if (nNewItemIndex >0)
                    CurrentPageIndex ++;

                if (nNewItemIndex == 0)
                    nNewItemIndex = PageSize-1;
                else
                    nNewItemIndex--;

                return nNewItemIndex;
            }

            

            // Add Edit and Delete columns
            private void AddWorkerColumns()
            {
                if (ShowWebdings)
                {
                    EditColumnText = "/";
                    EditColumnUpdateText = "R";
                    EditColumnCancelText = "T";
                    DeleteColumnText = "r";
                }

                // Edit column
                EditCommandColumn editColumn = new EditCommandColumn();
                editColumn.EditText = EditColumnText;
                editColumn.UpdateText = EditColumnUpdateText;
                editColumn.CancelText = EditColumnCancelText;
                if (ShowWebdings)
                {
                    editColumn.ItemStyle.Font.Size = 11;
                    editColumn.ItemStyle.Font.Name = "wingdings 2";
                }
                Columns.Add(editColumn);


                // Delete column
                ButtonColumn deleteColumn = new ButtonColumn();
                deleteColumn.CommandName = "delete";
                deleteColumn.Text = DeleteColumnText;
                if (ShowWebdings)
                    deleteColumn.ItemStyle.Font.Name = "webdings";
                Columns.Add(deleteColumn);
            }



            // Customize items in the grid
            private void CustomizeItem(DataGridItemEventArgs e)
            {
                WebControl wc;

                // Adds a tooltip to Edit
                wc = ((WebControl) e.Item.Cells[Columns.Count-2]);
                wc.ToolTip = "Edit this row";
        
                // Adds a client-side onclick handler and a tooltip to Delete
                wc = ((WebControl) e.Item.Cells[Columns.Count-1]);
                String js = "return confirm('Do you really want to delete this row?');";
                wc.Attributes["onclick"] = js;
                wc.ToolTip = "Delete this row";
            }
        }

        public sealed class DataGridInitRowEventArgs : EventArgs
        {
            public DataRow Row;
        }
    }
}

TAG

Smile Big Smile Surprise Stick out tongue Wink Sad Tongue Tied Indifferent Crying Embarrassed Cool Angry Angel Devil [8-|] [:#] [:-*] [:^)] [<:o)] [|-)] Yes Beer Left Hug Music Star Time Snail Pizza Automobile Umbrella Computer Storm [mo] [8o|] [^o)] [+o(] [*-)] [8-)] Coffee No Drinks [Z] Right Hug Cake Broken Heart Gift Wilted Flower Movie Dog Idea Sleep Email Travel Paradise
呢称:

加粗 斜体 下划线 链接 图片 代码 邮件地址 引用 列表

最多只能输入100个字符

Tags

SQL 数据库 asp.net C# XML 控件 .NET教程 程序 事件 数据 安全 代码 Server 客户端 验证 数据库专栏 接口 文件 Oracle DataSet 函数 DataGrid 问题 .net return C#语言 JavaScript 服务 IIS 对象 语句 windows 继承 时间 web.config 设计 开发 参数 变量 解决 字符 ADO.net 环境 VB.Net语言 web 异常 工具 服务器 计算 实例 OLEDB Application VB Word WebService insert asp net 安装 记录

精华推荐

更多

精品下载

更多