GridView编程创建模版,编辑状态不能保持!
前台:
<%@ Page Language= "C# " AutoEventWireup= "true " CodeFile= "Default2.aspx.cs " Inherits= "Default2 " %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN " "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
<html xmlns= "http://www.w3.org/1999/xhtml " >
<head runat= "server ">
<title> 无标题页 </title>
</head>
<body>
<form id= "form1 " runat= "server ">
<div>
<asp:GridView ID= "GridView2 " runat= "server " OnRowEditing= "GridView2_RowEditing " >
<Columns>
<asp:CommandField ShowEditButton= "True " />
</Columns>
<EditRowStyle Width= "60px " />
</asp:GridView>
<asp:Button ID= "Button1 " runat= "server " Text= "Button " /> </div>
</form>
</body>
</html>
后台:
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
public partial class Default2 : System.Web.UI.Page
{
DataTable dt = new DataTable();
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
CreatedGridView();
}
if (Session[ "sample "] != null)
{
GridView2.DataSource = ((DataTable)Session[ "sample "]).DefaultView;
this.GridView2.DataBind();
}
}
public void CreatedGridView()
{
DateTime BeginDate = Convert.ToDateTime( "2007-9-1 ");
DateTime EndDate = Convert.ToDateTime( "2007-9-3 ");
System.TimeSpan ts = EndDate - BeginDate;
DataColumn emyID = new DataColumn();
emyID.ColumnName = "编号 ";
DataColumn emyName = new DataColumn();
emyName.ColumnName = "姓名 ";
emyName.DataType = System.Type.GetType( "System.String ");
DataColumn dutyDate = new DataColumn();
dutyDate.ColumnName = "排班日期 ";
dutyDate.DataType = System.Type.GetType( "System.DateTime ");
dt.Columns.Add(emyID);
dt.Columns.Add(emyName);
dt.Columns.Add(dutyDate);
for (int i = 0; i < ts.Days ; i++)
{
TemplateField field = new TemplateField();
field.HeaderStyle.Wrap = false;
field.ItemStyle.HorizontalAlign = HorizontalAlign.Center;
field.HeaderText = BeginDate.AddDays(i).ToShortDateString();
field.ItemTemplate = new GridViewTemplate(ListItemType.Item, " ");
field.EditItemTemplate = new GridViewTemplate(ListItemType.Item, " ");
this.GridView2.Columns.Add(field);
}
DataRow dr = dt.NewRow();
dr[ "编号 "] = "1111111 ";
dr[ "姓名 "] = "华民国 ";
dr[ "排班日期 "] = DateTime.Now;
dt.Rows.Add(dr);
Session[ "sample "] = dt;
this.GridView2.DataSource = dt;
this.GridView2.DataBind();
}
public class GridViewTemplate : ITemplate
{
ListItemType templateType;
string columnName;
public GridViewTemplate(ListItemType type, string colname)
{
templateType = type;
columnName = colname;
}
public void InstantiateIn(System.Web.UI.Control container)
{
switch (templateType)
{
case ListItemType.Header:
//lc.Text = " <B> " + columnName + " </B> ";
//container.Controls.Add(lc);
break;
case ListItemType.Item:
DropDownList drr = new DropDownList();
drr.ID = "dropdown ";
drr.AppendDataBoundItems = true;
drr.Items.Add(new ListItem( "-----请选择------ ", " "));
drr.Items.Add(new ListItem( "AA ", "a "));
drr.Items.Add(new ListItem( "BB ", "b "));
drr.Items.Add(new ListItem( "CC ", "c "));
container.Controls.Add(drr);
break;
case ListItemType.EditItem:
//TextBox tb = new TextBox();
//tb.Text = " ";
//container.Controls.Add(tb);
break;
case ListItemType.Footer:
//lc.Text = " <I> " + columnName + " </I> ";
//container.Controls.Add(lc);
break;
}
}
}
protected void GridView2_RowEditing(object sender, GridViewEditEventArgs e)
{
this.GridView2.EditIndex = e.NewEditIndex;
this.GridView2.DataBind();
}
}
//以前代码可以放入vs2005运行
//动态创建的DropDownList在编辑时没有了,请问怎么保持?
[解决办法]
先帮你顶一下!
[解决办法]
this.GridView2.EditIndex = e.NewEditIndex;
this.GridView2.DataBind();
这样设置了应该没有问题了啊?
[解决办法]
非要动态创建么 在模板列里加行不/
加上后 再RowDataBound事件里 根据 列ID 去查出 数据 再加入到 DDL 中 好吧
------解决方案--------------------
经过分析知道,你的dropdownlist是程序创建的,所以在Edit的时候,程序没有创建,所以没有dropdownlist
解决办法,
Try
protected void GridView2_RowEditing(object sender, GridViewEditEventArgs e)
{
CreatedGridView();
this.GridView2.EditIndex = e.NewEditIndex;
this.GridView2.DataBind();
}
[解决办法]
不过,没有细测,问题应该出在这,楼主可以自己尝试下
[解决办法]
1.
// 不要放在 IsPostBack 里面,
//if (!IsPostBack)
//{
CreatedGridView(); // 动态创建空件,你得保证每次请求页面都能够执行,否则空件就没了
//}
2.
没看懂你的代码逻辑,
一般 Page_Load 里面的绑定代码,应该放在 !IsPostBack 里面, 否则回发时数据被重新绑定,覆盖了输入的值, Update 的时候得不到新值
if (!IsPostBack) { // !!!!
if (Session[ "sample "] != null)
{
GridView2.DataSource = ((DataTable)Session[ "sample "]).DefaultView;
this.GridView2.DataBind();
}
}
[解决办法]
void Page_Init(object sender, EventArgs e) // 最好在 Init 阶段或者更早,创建空件,否则 ViewState 可能无法正常的恢复
{
CreatedGridView();
}