gridview动态生成模版列后,实现编辑更新的问题

f360930109 2008-07-13 09:30:44
我需要实现的结果是
根据设置,运行时在gridview中生成不同的模版列,绑定数据并在gridview中实现编辑删除。

在网上找了一些资料后。实现了部分效果
1、根据设置生成模版列并绑定数据实现了
方法:动态生成TemplateField并插入到gridview。代码如下:
(当处理GridView1_RowEditing的时候发现,如果我在load时加上了if (!IsPostBack)则点编辑后会在gridview增加
与现有列数目相同的空列,去掉if (!IsPostBack)后发现还是增加,于是加上GridView1.Columns.Clear();后暂时可以实现
点击编辑后显示textbox并绑定数据了。与此同时遇到另一个问题,修改数据后,点更新的时候,无法查询到修改后的数据
还有一个问题:为什么我在load的时候Label l = (Label)GridView1.Rows[3].FindControl("label计算机");就能找到值而在GridView1_RowEditing如果加上if (!IsPostBack)则label l的值就时null呢?)
2、如何实现编辑更新?是不是我的方法错了?各位大大给点建议。谢谢

我问的有不清楚的地方请各位大大提出来呀。谢谢各位啦

protected void Page_Load(object sender, EventArgs e)
{
//if (!IsPostBack)
//{
GridView1.Columns.Clear();
tf4 = new TemplateField();
tf4.ItemTemplate = new GridViewTemplate("Label", "计算机");
tf4.EditItemTemplate = new GridViewTemplate("TextBox", "计算机");
tf4.HeaderText = "计算机";
GridView1.Columns.Add(tf4);
tf4 = new TemplateField();
tf4.ItemTemplate = new GridViewTemplate("Label", "数学");
tf4.EditItemTemplate = new GridViewTemplate("TextBox", "数学");
tf4.HeaderText = "数学";
GridView1.Columns.Add(tf4);

cf = new CommandField();
cf.ShowDeleteButton = false;
cf.ShowCancelButton = false;
cf.ShowEditButton = true;
GridView1.Columns.Add(cf);
databind();
Label l = (Label)GridView1.Rows[3].FindControl("label计算机");
if (l != null) TextBox1.Text = "GridView1.Rows[3] label.text = " + l.Text;
Label l2 = (Label)GridView1.Rows[3].FindControl("labeltext");
if (l2 != null) TextBox2.Text = "GridView1.Rows[3] l2.text" + l2.Text;
//}
}



public class GridViewTemplate : ITemplate
{
private string temptype;
private string columnName;
public GridViewTemplate(string type, string colname)
{
temptype = type;
columnName = colname;
}
public void InstantiateIn(System.Web.UI.Control container)
{
switch (temptype.ToLower())
{
case "textbox":
TextBox textbox = new TextBox();
textbox.ID = "textbox" +columnName;
textbox.Text = "test";
//container.Controls.Add(textbox);
textbox.DataBinding += new EventHandler(this.OnDataBinding);
textbox.TextChanged += new EventHandler(this.OnTextChanged);
container.Controls.Add(textbox);
break;
case "label":
Label label = new Label();
label.ID = "label" +columnName;
//container.Controls.Add(label);
label.DataBinding += new EventHandler(this.OnDataBinding);
container.Controls.Add(label);
break;
default:
break;
}
}
private void OnTextChanged(object sender, EventArgs e)
{
((TextBox)sender).Text += ":";
}
public void OnDataBinding(object sender, EventArgs e)
{
GridViewRow container;
switch(temptype.ToLower())
{
case "label":
Label l1 = (Label)sender;
container = (GridViewRow)l1.NamingContainer;
//l1.Text = ((DataRowView)container.DataItem)[columnName].ToString();
l1.Text = DataBinder.Eval(container.DataItem, columnName).ToString();
break;
case "textbox":
TextBox l = (TextBox)sender;
container = (GridViewRow)l.NamingContainer;
//l.Text = ((DataRowView)container.DataItem)[columnName].ToString();
l.Text = DataBinder.Eval(container.DataItem, columnName).ToString();
break;
default:
break;
}
}
}


protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
Label l = (Label)GridView1.Rows[e.NewEditIndex].FindControl("label");
TextBox lt = (TextBox)GridView1.Rows[e.NewEditIndex].FindControl("textbox计算机");
if (l == null) TextBox1.Text = "l == null is true;";
if (l != null) TextBox1.Text = "l = " + l.Text;
Label l3 = (Label)GridView1.Rows[e.NewEditIndex].FindControl("label数学");
if (l3 != null) TextBox1.Text += "l3 = " + l3.Text;
GridView1.EditIndex = e.NewEditIndex;
databind();
}



ICollection CreateDataSource()
{
System.Data.DataTable dt = new System.Data.DataTable();
System.Data.DataRow dr;
dt.Columns.Add(new System.Data.DataColumn("学生班级", typeof(System.String)));
dt.Columns.Add(new System.Data.DataColumn("学生姓名", typeof(System.String)));
dt.Columns.Add(new System.Data.DataColumn("语文", typeof(System.Decimal)));
dt.Columns.Add(new System.Data.DataColumn("数学", typeof(System.Decimal)));
dt.Columns.Add(new System.Data.DataColumn("英语", typeof(System.Decimal)));
dt.Columns.Add(new System.Data.DataColumn("计算机", typeof(System.Decimal)));

for (int i = 0; i < 8; i++)
{
System.Random rd = new System.Random(Environment.TickCount * i); ;
dr = dt.NewRow();
dr[0] = "班级" + i.ToString();
dr[1] = "学生" + i.ToString();
dr[2] = System.Math.Round(rd.NextDouble() * 100, 2);
dr[3] = System.Math.Round(rd.NextDouble() * 100, 2);
dr[4] = System.Math.Round(rd.NextDouble() * 100, 2);
dr[5] = System.Math.Round(rd.NextDouble() * 100, 2);
dt.Rows.Add(dr);
}
System.Data.DataView dv = new System.Data.DataView(dt);
return dv;
}
...全文
544 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
JeffChung 2008-07-15
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 amandag 的回复:]
一般而言动态地创建的创建的模版列状态很难维持,很少在实际应用中使用
[/Quote]
zsj830120 2008-07-15
  • 打赏
  • 举报
回复
学习了。。
东北大亨 2008-07-15
  • 打赏
  • 举报
回复

前台做一个LinkButton 在后台中
创建的模版列放在 DataTable
DataTable1.Rows.RemoveAt(e.RowIndex);
GridView1.DataSource = DataTable1;
GridView1.DataBind();

测试通过的,运行中。
mengxj85 2008-07-13
  • 打赏
  • 举报
回复
绑定方法
protected void gvPurview_RowCreated(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.Header)
{
GridViewRow rowHeader = new GridViewRow(0, 0, DataControlRowType.Header, DataControlRowState.Normal);
rowHeader.BackColor = System.Drawing.Color.Blue;
rowHeader.Font.Bold = true;
TableCellCollection cells = e.Row.Cells;
//先添加两个空表头
TableCell headerCell = new TableCell();
headerCell.Wrap = false;
headerCell.Text = "";
rowHeader.Cells.Add(headerCell);
headerCell = new TableCell();
headerCell.Wrap = false;
headerCell.Text = "";
rowHeader.Cells.Add(headerCell);
headerCell = new TableCell();
headerCell.Wrap = false;
headerCell.Text = "";
rowHeader.Cells.Add(headerCell);

//添加科室的表头

//获得表头信息
DataTable tbDeptName = EditProc.GetAllPurviewMatrixColName();
if (tbDeptName == null)
return;
for (int i = 0; i < tbDeptName.Rows.Count; i++)
{
headerCell = new TableCell();
headerCell.Text = tbDeptName.Rows[i]["deptName"].ToString();
headerCell.HorizontalAlign = HorizontalAlign.Center;


headerCell.ColumnSpan = 5;
rowHeader.Cells.Add(headerCell);
}


//可见
rowHeader.Visible = true;
gvPurview.Controls[0].Controls.AddAt(0, rowHeader);
}
}
mengxj85 2008-07-13
  • 打赏
  • 举报
回复
编辑功能用Gridview中自带的编辑列,感觉你的代码有些多,现在没功夫看看,给我参考一下我们的做法吧。
protected void gvPurview_RowEditing(object sender, GridViewEditEventArgs e)
{
gvPurview.EditIndex = e.NewEditIndex;
//重新绑定
DataTable tbPurview = PurviewProc.GetAllPurviewInfo();
gvPurview.DataSource = tbPurview;
gvPurview.DataBind();
}
protected void gvPurview_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
DataTable tbPurview = PurviewProc.GetAllPurviewInfo();

string sql="update PurviewMatrix ";
string purviewId = gvPurview.DataKeys[e.RowIndex].Value.ToString();

sql = sql + " set " + tbPurview.Columns[2].ToString() + "=" + ChangeBit(((TextBox)gvPurview.Rows[e.RowIndex].Cells[3].Controls[0]).Text).ToString();

for (int i = 4; i < gvPurview.Columns.Count; i++)
{
sql = sql + ", " + tbPurview.Columns[i-1].ToString() + "=" + ChangeBit(((TextBox)gvPurview.Rows[e.RowIndex].Cells[i].Controls[0]).Text).ToString();
}
sql = sql + " where purviewId = " + purviewId;


SqlCommand comm = DataAccess.CreateCommand();
comm.CommandType = CommandType.Text;
comm.CommandText = sql;
string flag = DataAccess.ExecuteNonQueryCommand(comm);
if (flag!="true")
Response.Write("<script language = 'javascript'> alert('输入有误!')");

//恢复状态
gvPurview.EditIndex = -1;
//绑定数据库
DataTable tbNew = PurviewProc.GetAllPurviewInfo();
gvPurview.DataSource = tbNew;
gvPurview.DataBind();

}
amandag 2008-07-13
  • 打赏
  • 举报
回复
一般而言动态地创建的创建的模版列状态很难维持,很少在实际应用中使用
walkghost 2008-07-13
  • 打赏
  • 举报
回复
路过,帮顶。
f360930109 2008-07-13
  • 打赏
  • 举报
回复
急用。谢谢各位
f360930109 2008-07-13
  • 打赏
  • 举报
回复
谢谢各位。
f360930109 2008-07-13
  • 打赏
  • 举报
回复
谢谢大家
谢谢mengxj85
谢谢amandag
我看一下。
大家有什么建议继续提呀

62,168

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧