为DataGrid添加自定义DataGridColumn类的例子

发表于:2007-06-30来源:作者:点击数: 标签:
DataGrid的模板列可以方便的定制所需要的样式,比如上图: 在编辑状态的时候学院是下拉框,选择了当前的学院,但是如果学院很多,下拉框会很长,找起来也会很麻烦,所以可能需要再增加一个查找的功能。这样一个列完全可以通过模板列来实现,可是如果项目中有


DataGrid的模板列可以方便的定制所需要的样式,比如上图:
在编辑状态的时候学院是下拉框,选择了当前的学院,但是如果学院很多,下拉框会很长,找起来也会很麻烦,所以可能需要再增加一个查找的功能。这样一个列完全可以通过模板列来实现,可是如果项目中有很多这样的需求,添加这么多复杂的模板列一来很麻烦,二来也有代码冗余,没有重用性,为此,我们可以尝试定制自己的DataGridColumn(类似已经存在的HyperLinkColumn)来为这个列进行小小的封装。

先建立一个类文件:
using System;
using System.Data;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace csdn
{
    public class MyColumn:DataGridColumn
    {
        public string DataTextField;
        public string DataValueField;
        public DataTable DataSource;
                        
        public override void InitializeCell(TableCell cell,int columnIndex,ListItemType itemType)
        {
            base.InitializeCell(cell,columnIndex,itemType);
            switch(itemType)
            {
                case ListItemType.Header:
                    cell.Text=this.HeaderText;
                    break;
                case ListItemType.Item:case ListItemType.AlternatingItem:
                    cell.DataBinding+=new EventHandler(this.cell_ItemDataBinding);
                    break;
                case ListItemType.EditItem:
                    cell.DataBinding +=new EventHandler(cell_EditItemDataBinding);
                    DropDownList ddl=new DropDownList();
                    cell.Controls.Add(ddl);
                    TextBox t=new TextBox();
                    t.Width=80;
                    cell.Controls.Add(t);
                    Button b=new Button();
                    b.Text="查找";
                    b.Click+=new EventHandler(this.btn_Click);
                    cell.Controls.Add(b);
                    break;
            }
        }

        private void cell_ItemDataBinding(object sender, EventArgs e)
        {
            TableCell cell=(TableCell)sender;
            DataGridItem dgi=(DataGridItem)cell.NamingContainer;
            cell.Text=(DataBinder.Eval(dgi.DataItem,this.DataTextField)).ToString();
        }

        private void cell_EditItemDataBinding(object sender,EventArgs e)
        {
            TableCell cell=(TableCell)sender;
            DropDownList ddl=(DropDownList)cell.Controls[0];
            DataGridItem dgi=(DataGridItem)cell.NamingContainer;
            for(int i=0;i<this.DataSource.Rows.Count;i++)
                ddl.Items.Add(new ListItem(this.DataSource.Rows[i][this.DataTextField].ToString(),this.DataSource.Rows[i][this.DataValueField].ToString()));
            ddl.Items.FindByValue((DataBinder.Eval(dgi.DataItem,this.DataValueField)).ToString()).Selected=true;
        }

        private void btn_Click(object sender,EventArgs e)
        {
            TableCell cell=(TableCell)(((Button)sender).Parent);
            DropDownList ddl=(DropDownList)cell.Controls[0];
            TextBox t=(TextBox)cell.Controls[1];
            DataGridItem dgi=(DataGridItem)cell.NamingContainer;
            ListItem li=ddl.Items.FindByText(t.Text);
            if(li!=null)
            {
                ddl.SelectedIndex=-1;
                li.Selected=true;
            }
        }
    }
}

原文转自:http://www.ltesting.net