去看更多

wangshijie
Welcome

分享——自定义Gridview用户控件,简单实用,希望大家多提宝贵意见

自己写的Gridview用户控件,实现了动态生成列;当行数不足n时,添加空白行;处理了Gridview行的鼠标事件。

 

public partial class GridViewPro : System.Web.UI.UserControl
    {
        private const int n = 20; //默认显示的行数
        private IEnumerable _DataSource;
        /// <summary>
        ///Gridview的数据源属性。
        /// </summary>
        public IEnumerable DataSource
        {
            set
            {
                _DataSource = value;
            }
        }
        private string[] _Head;
        /// <summary>
        /// Gridview的表头属性。
        /// </summary>
        public string[] Head
        {
            set
            {
                _Head = value;
            }
        }
        private string[] _Field;
        /// <summary>
        /// 设置Gridview的绑定的列名。
        /// </summary>
        public string[] Field
        {
            set
            {
                _Field = value;
            }
        }
        private string _Key;
        /// <summary>
        /// Gridview的主键属性。
        /// </summary>
        public string Key
        {
            set
            {
                _Key = value;
            }
        }
        private string _Href;
        /// <summary>
        /// Gridview双击行时跳转地址属性。
        /// </summary>
        public string Href
        {
            set
            {
                _Href = value;
            }
        }
      
        protected void Page_Load(object sender, EventArgs e)
        {

        }
        /// <summary>
        /// Gridview绑定
        /// </summary>
        public void Databind()
        {
            GridView1.DataSource = _DataSource;
            GridView1.DataKeyNames = new string[] { _Key };
            BoundField bf = null;
            GridView1.Columns.Clear();
            GridView1.AutoGenerateColumns = false;
          
            for (int i = 0; i < _Head.Length; i++)
            {
                bf = new BoundField();
                bf.HeaderText = _Head[i];
                bf.DataField = _Field[i];
                GridView1.Columns.Add(bf);
                GridView1.Columns[i].ItemStyle.Width = 150;
            }
            GridView1.DataBind();

 

            //当数据为空时添加空行
            if (GridView1.Rows.Count == 0)
            {
                DataTable dt = new DataTable();  //定义一个表,当DataSource为空时绑定之,否则,Gridview控件就不能显示
                DataRow dr;
                for (int i = 0; i < _Head.Length; i++)
                {
                    dt.Columns.Add(new DataColumn(_Field[i], typeof(string)));//dt的列必须保持与Gridview一致
                    dr = dt.NewRow();
                    dr[i] = "&nbsp;";
                }
                dt.Columns.Add(new DataColumn(_Key, typeof(string)));
                dr = dt.NewRow();
                dr[_Head.Length] = "&nbsp;";
                dt.Rows.Add(dr);
                GridView1.DataSource = dt;
                GridView1.DataBind();
            }

        }
     
        protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            //判断是否是DataRow
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
              
                string SelectID = GridView1.DataKeys[e.Row.RowIndex].Value.ToString();//((ClientList)(e.Row.DataItem)).ClientID;
                if (!String.IsNullOrEmpty(SelectID)) //如果行为空,就禁用鼠标事件
                {
                    //鼠标双击Row时的效果
                    e.Row.Attributes.Add("ondblclick", "javascript:window.location.href='"+_Href+"?ID=" + SelectID+ "';");
                    //鼠标经过Row时的效果
                    e.Row.Attributes.Add("onmouseover", "this.classname=onColor2(this)");
                    //鼠标离开Row时的效果
                    e.Row.Attributes.Add("onmouseout", "this.classname=offColor2(this)");
                    //鼠标键Row时的效果
                    e.Row.Attributes.Add("onmousedown", "this.classname=downColor(this," + SelectID + ")");
                }
               
            }
            if (e.Row.RowType == DataControlRowType.Footer)
            {

                //当Gridview行不足n时,填充空白行
                for (int i = 0; i < n - GridView1.Rows.Count; i++)
                {
                    int rowIndex = GridView1.Rows.Count + i + 1;
                    GridViewRow row = new GridViewRow(rowIndex, -1, DataControlRowType.EmptyDataRow, DataControlRowState.Normal);
                    for (int j = 0; j < GridView1.Columns.Count; j++)
                    {
                        TableCell cell = new TableCell();
                        cell.Text = "&nbsp;";
                        row.Controls.Add(cell);
                        row.Attributes.Add("BorderColor ", "#d2d2d2");
                    }

                    GridView1.Controls[0].Controls.AddAt(rowIndex, row);

                }
            }
            e.Row.Attributes.Add("BorderColor ", "#d2d2d2");
        }

    }

 

     有个很大的不足之处就是当调用页面触发事件时,属性的值就没了,你需要每次在触发事件时再赋值。

可以把属性用视图状态ViewState来设置,这样就不必每次都要赋值了

 public string Key
        {
            set
            {
               ViewState["Key"] = value;
            }
        }

 

  GridView1.DataKeyNames =  (string)ViewState["Key"] ;

 

 

以下是调用页面:

 public partial class VendorList : System.Web.UI.Page
    {
        private   BFLList Blist;
        private   IQueryable<myInfoList> VList;
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                Blist = new BFLList();
                VList = Blist.GetVendorAll();
                GridInit();
            }
           
        }

        private void GridInit()
        {

            GridViewPro1.DataSource = VList;
            GridViewPro1.Key = "ID";
            GridViewPro1.Href = "VendorEdit.aspx";
            string[] Head = new string[]
           {
               "编码",
               "供应商简称",
               "地区",
               "类型"
           };
            string[] Field = new string[]
            {
                "Code",
                "ShortName",
                "AreaName",
                "TypeName"
            };

            GridViewPro1.Head = Head;
            GridViewPro1.Field = Field;
            GridViewPro1.Databind();
        }

posted @ 2009-04-11 22:53  jeer  阅读(478)  评论(0编辑  收藏  举报