GridView自定义用户控件实现增、删、改

来源:互联网 发布:高斯金字塔算法 编辑:程序博客网 时间:2024/06/06 18:55

以下是我的用户控件代码,暂时定义为MyGridView,当然它继承于GridView。

public partial class MyGridView : GridView    {        public MyGridView()        {            ViewState["SHOWBUFFER"] = new DataTable();            ViewState["DATABUFFER"] = new DataTable();        }        protected void Page_Load(object sender, EventArgs e)        {                    }        #region 属性        private string[] _LIST_REQCOLUMN;        /// <summary>        /// 非空列列表        /// </summary>        [Description("非空列列表,注意:列名必须是DataPropertyName")]        public string[] LIST_REQCOLUMN        {            get { return _LIST_REQCOLUMN; }            set { _LIST_REQCOLUMN = value; }        }        private string _SORTCOLUMN = "";        /// <summary>        /// 排序字段名称        /// </summary>        [Description("排序字段名称,此处注册后,行移动将改变此字段值")]        public string SORTCOLUMN        {            get { return _SORTCOLUMN; }            set { _SORTCOLUMN = value; }        }        private bool _IS_SAVE_SORT;        public bool IS_SAVE_SORT        {            get { return _IS_SAVE_SORT; }            set { _IS_SAVE_SORT = value; }        }        #endregion        #region 公用方法        /// <summary>获取ROWID        /// 获取ROWID        /// </summary>        /// <returns>最新的ROWID</returns>        public int GetRowid()        {            int ROWID = 0;            if (ViewState["ROWID"] == null)            {                ROWID = 1;                ViewState["ROWID"] = 1;            }            else            {                ROWID = (int)ViewState["ROWID"];                ROWID = ROWID + 1;                ViewState["ROWID"] = ROWID;            }            return ROWID;        }        /// <summary>        /// DataTable的行拷贝,参数aDR:要复制的行,返回复制完成的行        /// </summary>        /// <param name="aDR">要被复制的DataTable行</param>        /// <returns>已经复制好的行</returns>        [Description("DataTable的行拷贝,参数aDR:要复制的行,返回复制完成的行")]        protected DataRow RowCopy(DataRow aDR)        {            DataRow retDr = aDR.Table.NewRow();            retDr.ItemArray = aDR.ItemArray;            return retDr;        }        /// <summary>        /// DataTable的行拷贝,参数aDT:要复制的DataTable,aRowNum:要复制行的行号,返回复制完成的行        /// </summary>        /// <param name="aDT">要操作的DataTable</param>        /// <param name="aRowNum">要复制行的行号</param>        /// <returns>返回复制完成的行</returns>        [Description("DataTable的行拷贝,参数aDT:要复制的DataTable,aRowNum:要复制行的行号,返回复制完成的行")]        protected DataRow RowCopy(DataTable aDT, int aRowNum)        {            return RowCopy(aDT.Rows[aRowNum]);        }        /// <summary>        /// 查找指定列名的列是否存在        /// </summary>        /// <param name="aColumnName">列名</param>        /// <returns>如果列存在则返回列号,否则返回-1</returns>        [Description("查找指定列名的列是否存在,如果列存在则返回列号,否则返回-1")]        public int FindColumn(DataTable aDt, string aColumnName)        {            int vColIndex = -1;            for (int i = 0; i < aDt.Columns.Count; i++)            {                if (aDt.Columns[i].ColumnName.ToUpper() == aColumnName.ToUpper())                {                    vColIndex = i;                    break;                }            }            return vColIndex;        }        /// <summary>        /// 获取指定列号列的名称        /// </summary>        /// <param name="aColumnIndex">列号</param>        /// <returns>找到列的名称,如果列号小于0或大于等于列总数则返回“”</returns>        [Description("获取指定列号列的名称,如果列号小于0或大于等于列总数则返回“”")]        public string FindColumn(int aColumnIndex)        {            string vColunnName = "";            DataTable DT = GetShowBufferData();            if (aColumnIndex < 0 || aColumnIndex >= DT.Columns.Count)            {                vColunnName = "";            }            else            {                vColunnName = DT.Columns[aColumnIndex].ColumnName;            }            return vColunnName;        }        public string GetColumnHeadText(int aColumnIndex)        {            string vHeaderText = "";            if(!(aColumnIndex < 0 || aColumnIndex >= Columns.Count))            {                vHeaderText = (Columns[aColumnIndex].HeaderText);            }            return vHeaderText;        }        #endregion        #region 数据操作相关方法        /// <summary>        /// 得到需要保存的(新增、修改、删除)记录列表        /// </summary>        /// <returns>需要保存的记录列表</returns>        [Description("得到需要保存的(新增、修改、删除)记录列表")]        public virtual DataTable GetSaveRow()        {            string FilterStr = "";            DataTable DATABUFFER = (DataTable) ViewState["DATABUFFER"];            DataTable SHOWBUFFER = (DataTable)ViewState["SHOWBUFFER"];            DataTable saveTable = DATABUFFER.Clone();            int colnum = saveTable.Columns.Count;            for (int i = 0; i < colnum; i++)            {                DataColumn dcol = saveTable.Columns[i];                saveTable.Columns.Add(dcol.ColumnName + "_OLD", dcol.DataType);            }            saveTable.Columns.Add("OPTYPE", Type.GetType("System.String"));            #region 收集修改过的和新增记录            foreach (DataRow drFind in SHOWBUFFER.Rows)            {                FilterStr = "ROWID = " + drFind["ROWID"].ToString();                DataRow[] foundRows = DATABUFFER.Select(FilterStr);                if (foundRows.Length > 0)                {//收集修改记录列表                    bool isEqual = true;                    for (int i = 0; i < SHOWBUFFER.Columns.Count; i++)                    {                        string vCol = SHOWBUFFER.Columns[i].ColumnName;                        //if (!drFind[vCol].ToString.Equals(foundRows[0][vCol]))                        if (drFind[vCol].ToString() != foundRows[0][vCol].ToString())                        {                            isEqual = false;                            break;                        }                    }                    if (!isEqual)                    {                        DataRow drSave = saveTable.NewRow();                        int colscnt = drFind.ItemArray.Length;                        for (int i = 0; i < colscnt; i++)                        {                            drSave[SHOWBUFFER.Columns[i].ColumnName] = drFind[SHOWBUFFER.Columns[i].ColumnName];                            if (SHOWBUFFER.Columns[i].ColumnName.ToUpper() != "ROWID")                            {                                drSave[SHOWBUFFER.Columns[i].ColumnName + "_OLD"] = foundRows[0][SHOWBUFFER.Columns[i].ColumnName];                            }                        }                                                drSave["OPTYPE"] = "UPDATE";                        saveTable.Rows.Add(drSave);                    }                }                else                {                    DataRow drSave = saveTable.NewRow();                    int colscnt = drFind.ItemArray.Length;                    for (int i = 0; i < colscnt; i++)                    {                        drSave[SHOWBUFFER.Columns[i].ColumnName] = drFind[SHOWBUFFER.Columns[i].ColumnName];                    }                    drSave["OPTYPE"] = "INSERT";                    saveTable.Rows.Add(drSave);                }            }            #endregion            #region 收集被删除的记录            foreach (DataRow fdr in DATABUFFER.Rows)            {                FilterStr = "ROWID = " + fdr["ROWID"].ToString();                DataRow[] foundRow = SHOWBUFFER.Select(FilterStr);                if (foundRow.Length < 1)                {                    DataRow drSave = saveTable.NewRow();                    int colscnt = fdr.ItemArray.Length;                    for (int i = 0; i < colscnt; i++)                    {                        drSave[i] = fdr[i];                    }                    drSave["OPTYPE"] = "DELETE";                    saveTable.Rows.Add(drSave);                }            }            #endregion            return saveTable;        }        /// <summary>        /// 数据查询        /// </summary>        /// <param name="dt">要绑定的数据</param>        [Description("数据查询,需要DataTable")]        public void SetData(DataTable dt)        {            int colrowid = FindColumn(dt,"ROWID");            if (colrowid == -1)            {                dt.Columns.Add("ROWID", Type.GetType("System.Int32"));            }                        foreach (DataRow dr in dt.Rows)            {                dr["ROWID"] = GetRowid();            }            DataTable DATABUFFER = dt.Copy();            DataTable SHOWBUFFER = dt;            DataSource = SHOWBUFFER;            DataBind();            SetShowBufferData(SHOWBUFFER);            SetDataBufferData(DATABUFFER);        }        /// <summary>        /// 获取显示缓冲数据        /// </summary>        /// <returns></returns>        [Description("获取显示缓冲数据,返回DataTable")]        public DataTable GetShowBufferData()        {            if (ViewState["SHOWBUFFER"] == null) ViewState["SHOWBUFFER"] = new DataTable();            return (DataTable)ViewState["SHOWBUFFER"];        }        /// <summary>        /// 获取原始缓冲数据        /// </summary>        /// <returns></returns>        [Description("获取原始缓冲数据,返回DataTable")]        public DataTable GetDataBufferData()        {            if (ViewState["DATABUFFER"] == null) ViewState["DATABUFFER"] = new DataTable();            return (DataTable)ViewState["DATABUFFER"];        }        /// <summary>        /// 缓冲显示数据        /// </summary>        /// <param name="aDt">要缓冲的数据</param>        [Description("缓冲显示数据")]        public void SetShowBufferData(DataTable aDt)        {            ViewState["SHOWBUFFER"] = aDt;        }        /// <summary>        /// 缓冲原始数据        /// </summary>        /// <param name="aDt">要缓冲的数据</param>        [Description("缓冲原始数据")]        public void SetDataBufferData(DataTable aDt)        {            ViewState["DATABUFFER"] = aDt;        }        /// <summary>        /// 数据非空检查        /// </summary>        /// <returns>true:通过检查,false:未通过检查</returns>        [Description("数据非空检查,返回true:通过检查,false:未通过检查")]        public string DataNotNullCheck()        {            DataTable SHOWBUFFER = (DataTable)ViewState["SHOWBUFFER"];            bool vMark = true;            string vRet = "";            if (LIST_REQCOLUMN.Length > 0)            {                for (int vRow = 0; vRow < Rows.Count; vRow++)                {                    for (int vCol = 0; vCol < LIST_REQCOLUMN.Length; vCol++)                    {                        if (SHOWBUFFER.Rows[vRow][LIST_REQCOLUMN[vCol]] == DBNull.Value)                        {                            vMark = false;                            vRet = "第" + vRow.ToString() + "行,第" + vCol.ToString() + "列不能为空!";                            break;                        }                    }                    if (!vMark) break;                }            }            return vRet;        }        /// <summary>        /// 新增一行        /// </summary>        /// <returns>返回GridView新增的行</returns>        public GridViewRow AddRow()        {            DataTable showBuffer = GetShowBufferData();            DataRow newRow = showBuffer.NewRow();            int vRowId = GetRowid();            newRow["ROWID"] = vRowId;            showBuffer.Rows.Add(newRow);            DataSource = showBuffer;            DataBind();            SetShowBufferData(showBuffer);            return Rows[Rows.Count - 1];        }        /// <summary>        /// 删除指定行号的记录        /// </summary>        /// <param name="aRowIndex">要删除行的行号</param>        public void DeleteRow(List<int> aRowIndex)        {            if (aRowIndex.Count < 1) return;            int vMark = 0;            for (int i = 0; i < aRowIndex.Count; i++)            {                vMark = aRowIndex[i];                for (int j = i + 1; j < aRowIndex.Count; j++)                {                    if (vMark > aRowIndex[j])                    {                        vMark = aRowIndex[j];                    }                }                aRowIndex[i] = vMark;            }            DataTable showBuffer = GetShowBufferData();            for (int i = aRowIndex.Count - 1; i >= 0; i--)            {                showBuffer.Rows.RemoveAt(aRowIndex[i]);            }            DataSource = showBuffer;            DataBind();            SetShowBufferData(showBuffer);        }        #endregion    }

上面的MyGridView已经完成了封装,在页面中拖入该用户控件即可,后台中就可以调用相关的方法。下面看看在页面中怎么实现增、删、改


查询

在页面初始化时,调用封装类中的SetData方法


插入 之前

//同步展示表数据        public void SendGridViewToShowBUffer()        {            DataTable showbuffer = gvAccount.GetShowBufferData();            foreach (GridViewRow gvrow in gvAccount.Rows)            {                int RowIndex = gvrow.RowIndex;                Label lblID = (Label)gvrow.FindControl("lblID");                showbuffer.Rows[RowIndex]["ID"] = lblID.Text == "" ? 0 : Convert.ToInt32(lblID.Text);                DropDownList ddlItemSection = (DropDownList)gvrow.FindControl("ddlItemSection");                showbuffer.Rows[RowIndex]["SECTION"] = ddlItemSection.SelectedValue;                DropDownList ddlItemSubject = (DropDownList)gvrow.FindControl("ddlItemSubject");                showbuffer.Rows[RowIndex]["SUBJECT"] = ddlItemSubject.SelectedValue == "" ? 0 : Convert.ToInt32(ddlItemSubject.SelectedValue);                TextBox txtAmount = (TextBox)gvrow.FindControl("txtAmount");                showbuffer.Rows[RowIndex]["AMOUNT"] = txtAmount.Text == "" ? 0.00M : Convert.ToDecimal(txtAmount.Text);                TextBox txtOccuredTime = (TextBox)gvrow.FindControl("txtOccuredTime");                showbuffer.Rows[RowIndex]["OCCURED_TIME"] = txtOccuredTime.Text.ToString();                DropDownList ddlItemCreator = (DropDownList)gvrow.FindControl("ddlItemCreator");                showbuffer.Rows[RowIndex]["CREATOR"] = ddlItemCreator.SelectedValue;                TextBox txtCreatedTime = (TextBox)gvrow.FindControl("txtCreatedTime");                showbuffer.Rows[RowIndex]["CREATED_TIME"] = txtCreatedTime.Text.ToString();                DropDownList ddlCommitFlag = (DropDownList)gvrow.FindControl("ddlCommitFlag");                showbuffer.Rows[RowIndex]["COMMIT_FLAG"] = ddlCommitFlag.SelectedValue;                DropDownList ddlItemProject = (DropDownList)gvrow.FindControl("ddlItemProject");                try                {                    showbuffer.Rows[RowIndex]["PROJECT"] = Convert.ToInt32(ddlItemProject.SelectedValue);                }                catch                {                    showbuffer.Rows[RowIndex]["PROJECT"] = DBNull.Value;                }                TextBox txtRemark = (TextBox)gvrow.FindControl("txtRemark");                showbuffer.Rows[RowIndex]["REMARK"] = txtRemark.Text;            }            gvAccount.SetShowBufferData(showbuffer);        }

这个方法很重要,无论执行增、删还是改都得调用该方法,GridViewRow中的列根据自己的需要修改。


插入

 protected void btnAdd_Click(object sender, EventArgs e)        {            SendGridViewToShowBUffer();            GridViewRow gr = gvAccount.AddRow();            DropDownList ddlItemCreator = (DropDownList)gr.FindControl("ddlItemCreator");            ddlItemCreator.SelectedValue = GetUser();            TextBox txtCreatedTime = (TextBox)gr.FindControl("txtCreatedTime");            txtCreatedTime.Text = DateTime.Now.ToString("yyyy-MM-dd");        }


删除

protected void btnDelete_Click(object sender, EventArgs e)        {            SendGridViewToShowBUffer();            int cnt = gvAccount.Rows.Count;            List<int> vDelRowList = new List<int>();            for (int i = 0; i < cnt; i++)            {                GridViewRow gvr = gvAccount.Rows[i];                CheckBox cbs = (CheckBox)gvr.FindControl("ckbSelect");                if (cbs.Checked)                {                    vDelRowList.Add(i);                }            }            gvAccount.DeleteRow(vDelRowList);        }


保存

 public string SaveAccount()        {            string vRet = string.Empty;            bool vFlag = ValCell();            if (vFlag == true)            {                SendGridViewToShowBUffer();                DataTable saveData = gvAccount.GetSaveRow();                List<T_SECTION_INOUT> vProjectList = new List<T_SECTION_INOUT>();                for (int i = 0; i < saveData.Rows.Count; i++)                {                    DataRow dr = saveData.Rows[i];                    T_SECTION_INOUT vAccount = new T_SECTION_INOUT();                    string vOpType = dr["OPTYPE"].ToString();                    vAccount.OPTYPE = vOpType;                    switch (vOpType)                    {                        case "DELETE":                            {                                vAccount.ID = Convert.ToInt32(dr["ID"].ToString());                                break;                            }                        case "INSERT":                            {                                vAccount.Section = dr["SECTION"].ToString();                                vAccount.Subject = dr["SUBJECT"].ToString();                                vAccount.Amount = Convert.ToDecimal(dr["AMOUNT"].ToString());                                vAccount.OccuredTime = Convert.ToDateTime(dr["OCCURED_TIME"].ToString());                                vAccount.Creator = dr["CREATOR"].ToString(); ;                                vAccount.CreatedTime = Convert.ToDateTime(dr["CREATED_TIME"].ToString());                                vAccount.CommitFlag = Convert.ToChar(dr["COMMIT_FLAG"].ToString());                                vAccount.Project = Convert.ToInt32(dr["PROJECT"].ToString());                                vAccount.Remark = dr["REMARK"].ToString();                                break;                            }                        case "UPDATE":                            {                                vAccount.ID = Convert.ToInt32(dr["ID"].ToString());                                vAccount.Section = dr["SECTION"].ToString();                                vAccount.Subject = dr["SUBJECT"].ToString();                                vAccount.Amount = Convert.ToDecimal(dr["AMOUNT"].ToString());                                vAccount.OccuredTime = Convert.ToDateTime(dr["OCCURED_TIME"].ToString());                                vAccount.Creator = dr["CREATOR"].ToString(); ;                                vAccount.CreatedTime = Convert.ToDateTime(dr["CREATED_TIME"].ToString());                                vAccount.CommitFlag = Convert.ToChar(dr["COMMIT_FLAG"].ToString());                                vAccount.Project = Convert.ToInt32(dr["PROJECT"].ToString());                                vAccount.Remark = dr["REMARK"].ToString();                                break;                            }                        default:                            break;                    }                    vProjectList.Add(vAccount);                }                vRet = useBusiness.SaveAccount(vProjectList);                return vRet;            }            else            {                return "数据验证不通过!";            }        }

//保存        protected void btnSave_Click(object sender, EventArgs e)        {            string vSaveMsg = SaveAccount();            BindAccountData();            if (string.IsNullOrEmpty(vSaveMsg))            {                Response.Write("<script>alert('保存成功!');</script>");            }        }


保存调用的业务逻辑代码

public string SaveAccount(List<T_SECTION_INOUT> objList)        {            string ret = "";            string sql = "";            List<DbParameter> iParms = new List<DbParameter>();            for (int i = 0; i < objList.Count; i++)            {                switch (objList[i].OPTYPE.ToUpper())                {                    case "INSERT":                        {                            sql += @" insert into T_SECTION_INOUT                                          (SECTION,                                           SUBJECT,                                           AMOUNT,                                           OCCURED_TIME,                                           CREATOR,                                           CREATED_TIME,                                           COMMIT_FLAG,                                           PROJECT,                                           REMARK)                                        values                                       (@SECTION" + i.ToString() + ",@SUBJECT" + i.ToString() + ",@AMOUNT" + i.ToString() + ",";                            sql += "   @OCCURED_TIME" + i.ToString() + ",@CREATOR" + i.ToString() + ",@CREATED_TIME" + i.ToString() + ",@COMMIT_FLAG" + i.ToString() + ",@PROJECT" + i.ToString() + ",";                            sql += "   @REMARK" + i.ToString() + ");";                            iParms.Add(new SqlParameter("@SECTION" + i.ToString(), objList[i].Section));                            iParms.Add(new SqlParameter("@SUBJECT" + i.ToString(), objList[i].Subject));                            iParms.Add(new SqlParameter("@AMOUNT" + i.ToString(), objList[i].Amount));                            iParms.Add(new SqlParameter("@OCCURED_TIME" + i.ToString(), objList[i].OccuredTime));                            iParms.Add(new SqlParameter("@CREATOR" + i.ToString(), objList[i].Creator));                            iParms.Add(new SqlParameter("@CREATED_TIME" + i.ToString(), objList[i].CreatedTime));                            iParms.Add(new SqlParameter("@COMMIT_FLAG" + i.ToString(), objList[i].CommitFlag));                            iParms.Add(new SqlParameter("@PROJECT" + i.ToString(), objList[i].Project));                            iParms.Add(new SqlParameter("@REMARK" + i.ToString(), objList[i].Remark));                            break;                        }                    case "UPDATE":                        {                            sql += @" update T_SECTION_INOUT set SECTION = @SECTION" + i.ToString() + ", SUBJECT = @SUBJECT" + i.ToString();                            sql += " ,AMOUNT = @AMOUNT" + i.ToString() + ", OCCURED_TIME = @OCCURED_TIME" + i.ToString() + ", CREATOR = @CREATOR" + i.ToString() + ", CREATED_TIME = @CREATED_TIME" + i.ToString();                            sql += " ,COMMIT_FLAG = @COMMIT_FLAG" + i.ToString();                            sql += " ,PROJECT = @PROJECT" + i.ToString();                            sql += " ,REMARK = @REMARK" + i.ToString();                            sql += " where ID = @ID" + i.ToString() + ";";                            iParms.Add(new SqlParameter("@ID" + i.ToString(), objList[i].ID));                            iParms.Add(new SqlParameter("@SECTION" + i.ToString(), objList[i].Section));                            iParms.Add(new SqlParameter("@SUBJECT" + i.ToString(), objList[i].Subject));                            iParms.Add(new SqlParameter("@AMOUNT" + i.ToString(), objList[i].Amount));                            iParms.Add(new SqlParameter("@OCCURED_TIME" + i.ToString(), objList[i].OccuredTime));                            iParms.Add(new SqlParameter("@CREATOR" + i.ToString(), objList[i].Creator));                            iParms.Add(new SqlParameter("@CREATED_TIME" + i.ToString(), objList[i].CreatedTime));                            iParms.Add(new SqlParameter("@COMMIT_FLAG" + i.ToString(), objList[i].CommitFlag));                            iParms.Add(new SqlParameter("@PROJECT" + i.ToString(), objList[i].Project));                            iParms.Add(new SqlParameter("@REMARK" + i.ToString(), objList[i].Remark));                            break;                        }                    case "DELETE":                        {                            sql += @"delete T_SECTION_INOUT where ID = @ID" + i.ToString() + ";";                            iParms.Add(new SqlParameter("@ID" + i.ToString(), objList[i].ID));                            break;                        }                    default:                        break;                }            }            try            {                Excute(sql, iParms);            }            catch (Exception ex)            {                ret = ex.Message;            }            return ret;        }


整体上就是这么多,如果想熟练使用该控件,还需要把MyGridView类库中的方法给搞清楚。写这篇文章的主要目的还是想分享这个类库,后面的增、删、改只是针对自己项目进行的简单运用,欢迎各位交流,时间不早了,哎呀、今天终于睡迟了一回,各位晚安!