GridView 编辑列问题~~~~~~~ 重写了一个TextBox,如何在GridView列编辑时编辑文本框为这个TextBox控件??? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在编辑项模版中放自己写的textbox控件。 界面上的编辑项模版是空的, 里面的GridView列是动态生成的 以前有写过,现在重新复习下.下面代码测试通过.测试数据Create table userinfo( id int identity(1,1), UserName nvarchar(20))insert into userinfo(username)select '张三'union select '李四'unionselect '王五'因为要动态添加的是模板列,扩展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(); } 更正个错误,把"Select id,UserName From users"中的"users" 改成"userinfo",我数据库中有users表,没发现问题. 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; } }} 征集常用Window Mobile API 函数 请教关于C#类文件生成问题! 怎么获取datetimepicker中的月份 初学多线程的小问题,还多多帮助?顶者有分 急,在线等待,路径问题 请问如何给控件添加额外的事件(tabcontrol) 英文操作系统findwindowex查找中文标题 求正则表达式提取内容 如何以独占方式打开ACCESS数据库 c#中两个页面的控件值如何传递? 帮我写个触发器啊! c#开发C/S的管理系统,大家给点例子吧
(
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();
}
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;
}
}
}