重写了一个TextBox,如何在GridView列编辑时编辑文本框为这个TextBox控件???

解决方案 »

  1.   

    在编辑项模版中放自己写的textbox控件。
      

  2.   

    界面上的编辑项模版是空的, 里面的GridView列是动态生成的
      

  3.   

    以前有写过,现在重新复习下.下面代码测试通过.测试数据Create table userinfo
    (
    id int identity(1,1),
    UserName nvarchar(20)
    )insert into userinfo(username)
    select '张三'
    union 
    select '李四'
    union
    select '王五'
    因为要动态添加的是模板列,扩展ITemplate:using System;
    using System.Collections.Generic;
    using System.Web;
    using System.Web.UI.WebControls;
    using System.Web.UI;/// <summary>
    ///GridViewTextBoxTemplate 的摘要说明
    /// </summary>
    public class GridViewTextBoxTemplate : ITemplate
    {
        private DataControlRowType templateType;
        private DataControlRowState rowState;
        protected string HeaderText;
        protected string FieldName;    public GridViewTextBoxTemplate(DataControlRowType type,DataControlRowState state, string headerText,string fieldName)
        {
            templateType = type;
            rowState = state;
            HeaderText = headerText;
            FieldName = fieldName;
        }    /// <summary>
        /// 定义子控件
        /// </summary>
        /// <param name="container"></param>
        public void InstantiateIn(System.Web.UI.Control container)
        {
            switch (templateType)
            {                                                                              
                case DataControlRowType.Header:
                    Literal litHead = new Literal();
                    litHead.Text = HeaderText;
                    container.Controls.Add(litHead);
                    break;
                case DataControlRowType.DataRow:                if (rowState == DataControlRowState.Normal)
                    {
                        Literal litRow = new Literal();
                        litRow.DataBinding += new EventHandler(litRow_DataBinding);
                        litRow.Text = HeaderText;
                        container.Controls.Add(litRow);
                    }
                    else if (rowState == DataControlRowState.Edit)
                    {
                        TextBox txtBox = new TextBox();
                        txtBox.DataBinding += new EventHandler(txtBox_DataBinding);
                        container.Controls.Add(txtBox);
                    }
                    break;               
                default:
                    break;
            }
        }    /// <summary>
        /// Normal行数据绑定
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void litRow_DataBinding(object sender, EventArgs e)
        {
            Literal litRow = (Literal)sender;
            GridViewRow row = (GridViewRow)litRow.NamingContainer;
            litRow.Text = DataBinder.Eval(row.DataItem, FieldName).ToString();
        }    /// <summary>
        /// 修改行数据绑定
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void txtBox_DataBinding(object sender, EventArgs e)
        {        
            TextBox txtBox = (TextBox)sender;
            GridViewRow row = (GridViewRow)txtBox.NamingContainer;
            txtBox.Text = DataBinder.Eval(row.DataItem, FieldName).ToString();
        }
    }页面代码:<body>
        <form id="form1" runat="server">
        <div>    
            <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns = "false" 
                onrowediting="GridView1_RowEditing">     
            </asp:GridView>    
        </div>
        </form>
    </body>
    后台代码:private const string conString = "Server=SZSOFT-SZZB\\SQLEXPRESS;database=office;uid=sa;pwd=abc_!123456;";    protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {           
                GeneralColumns();
                BindData();
            }
        }
        /// <summary>
        /// 创建列
        /// </summary>
        private void GeneralColumns()
        {
            GridView1.Columns.Clear();        // 填加模板列
            TemplateField customField = new TemplateField();
            customField.HeaderTemplate = new GridViewTextBoxTemplate(DataControlRowType.Header,DataControlRowState.Normal,"名称","UserName");
            customField.ItemTemplate = new GridViewTextBoxTemplate(DataControlRowType.DataRow, DataControlRowState.Normal, "名称", "UserName");
            customField.EditItemTemplate = new GridViewTextBoxTemplate(DataControlRowType.DataRow, DataControlRowState.Edit, "名称", "UserName");
            GridView1.Columns.Insert(0, customField);        // 填加绑定列
            BoundField bField = new BoundField();
            bField.DataField = "id";
            bField.HeaderText = "ID";
            bField.ReadOnly = true;
            GridView1.Columns.Insert(0, bField);        // 填加CommandField
            CommandField cmdFile = new CommandField();
            cmdFile.ShowEditButton = true;
            GridView1.Columns.Insert(0,cmdFile);
        }    /// <summary>
        /// 绑定数据
        /// </summary>
        private void BindData()
        {
            GridView1.DataSource = GetData();
            GridView1.DataBind();
        }    /// <summary>
        /// 获取数据
        /// </summary>
        /// <returns></returns>
        private DataTable GetData()
        {
            SqlConnection con = new SqlConnection();
            con.ConnectionString = conString;
            con.Open();
            string sqlSelect = "Select id,UserName From users";
            SqlDataAdapter adapter = new SqlDataAdapter(sqlSelect, con);
            DataTable dt = new DataTable();
            adapter.Fill(dt);
            return dt;
        }    /// <summary>
        /// 修改列
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
        {
            GridView1.EditIndex = e.NewEditIndex;
            GeneralColumns();
            BindData();
        }
      

  4.   

    更正个错误,把"Select id,UserName From users"中的"users" 改成"userinfo",我数据库中有users表,没发现问题.
      

  5.   

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;namespace WindowsApplication55
    {
        public partial class Form1 : Form
        {
            DataGridView DGV = new DataGridView();
            TextBox TB = new TextBox();
            Timer T = new Timer();        public Form1()
            {
                InitializeComponent();            TB.TextChanged += new EventHandler(TB_TextChanged);            DGV.Parent = this;
                DGV.Columns.Add(new DataGridViewTextBoxColumn());
                DGV.Rows.Add(1);
                DGV.EditingControlShowing += new DataGridViewEditingControlShowingEventHandler(DGV_EditingControlShowing);
                T.Interval = 10;
                T.Tick += new EventHandler(T_Tick);
            }        void T_Tick(object sender, EventArgs e)
            {
                TB.Focus();
                T.Enabled = false;
            }        void TB_TextChanged(object sender, EventArgs e)
            {
                if (DGV.EditingControl != null)
                    DGV.EditingControl.Text = TB.Text;
            }        void DGV_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
            {
                TB.Text = e.Control.Text;
                DGV.EditingPanel.Controls.Clear();
                DGV.EditingPanel.Controls.Add(TB);
                DGV.EditingPanel.Controls[0].Size = DGV.EditingPanel.Size;
                T.Enabled = true;
            }
        }
    }