首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

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

2011-12-29 
gridview动态生成模版列后,实现编辑更新的问题我需要实现的结果是根据设置,运行时在gridview中生成不同的

gridview动态生成模版列后,实现编辑更新的问题
我需要实现的结果是
根据设置,运行时在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、如何实现编辑更新?是不是我的方法错了?各位大大给点建议。谢谢

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

C# code
 
    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;
        //}
    }


C# code
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;        }    }} 


C# code
 
    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();
    }


C# code
    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;    }


[解决办法]
一般而言动态地创建的创建的模版列状态很难维持,很少在实际应用中使用
[解决办法]
编辑功能用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();

}
[解决办法]

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

 测试通过的,运行中。
[解决办法]

探讨
一般而言动态地创建的创建的模版列状态很难维持,很少在实际应用中使用

热点排行