要求有一个按纽,按了后datagrid所有的记录的可编辑列变成编辑模式,就是变成textbox,然后再一个按纽全部更新.
注意:不是那种用增加个编辑列就可以搞定的,因为要一个按纽就可经编辑所有记录,而编辑列是一条一条的编辑.
自己想的解决方案,用绑定列,字符串格式为<input type="text" value="{0}">,可是这样的结果是无法获取文本域里面的值,因为datagrid1.items[i].cell[0].text里面只会显示其原先的值,而不是你输入的值.
十分郁闷,大家一起想想

解决方案 »

  1.   

    全部用模板列
    然后在保存的时候循环整个datagrid
      

  2.   

    做模板列,或者自己继续一下datagrid,自己添加相应的功能.
      

  3.   

    这个也是问题吗?用绑定列,字符串格式为<input type="text" value="{0}">,可是这样的结果是无法获取文本域里面的值,因为datagrid1.items[i].cell[0].text里面只会显示其原先的值,而不是你输入的值.
    ---------datagrid1.items[i].cell[0].text本来就是原先的值.从你的<input type="text" value="{0}">里找答案.模板列+循环应该可以解决你的问题.
      

  4.   

    html代码:
    <HTML>
    <HEAD>
    <title>mupgrid</title>
    <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
    <meta name="CODE_LANGUAGE" Content="C#">
    <meta name="vs_defaultClientScript" content="JavaScript">
    <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
    </HEAD>
    <body MS_POSITIONING="GridLayout">
    <form id="Form1" method="post" runat="server">
    <asp:DataGrid ID="mygrid" Runat="server" AutoGenerateColumns="False" DataKeyField="Employeeid"
    Font-Size="9pt" HeaderStyle-BackColor="darkred" HeaderStyle-ForeColor="white" BackColor="white"
    BorderColor="black">
    <AlternatingItemStyle BackColor="#ececec"></AlternatingItemStyle>
    <Columns>
    <asp:TemplateColumn>
    <HeaderTemplate>
    <asp:CheckBox ID="chekall" Runat="server" onclick="javascript: return select_deselectAll(this.checked,this.id);"></asp:CheckBox><font face="Webdings">a</font>
    </HeaderTemplate>
    <ItemTemplate>
    <input type="hidden" id="selectid" name="selectid" runat="server" value='<%# Container.ItemIndex%>'>
    <asp:CheckBox ID="chkbox" Runat="server"></asp:CheckBox>
    </ItemTemplate>
    </asp:TemplateColumn>
    <asp:BoundColumn DataField="employeeid" HeaderText="EmployeeID"></asp:BoundColumn>
    <asp:TemplateColumn>
    <HeaderTemplate>
    FirstName
    </HeaderTemplate>
    <ItemTemplate>
    <asp:Label ID="lab_firname" Runat="server" Text='<%# DataBinder.Eval(Container.DataItem,"firstname")%>'>
    </asp:Label>
    <asp:TextBox ID="txt_firname" Runat="server" Text='<%# DataBinder.Eval(Container.DataItem,"firstname")%>' Visible="False">
    </asp:TextBox>
    </ItemTemplate>
    </asp:TemplateColumn>
    <asp:TemplateColumn HeaderText="LastName">
    <ItemTemplate>
    <asp:Label ID="lab_lastname" Runat="server" Text='<%# DataBinder.Eval(Container.DataItem,"lastname")%>'>
    </asp:Label>
    <asp:TextBox ID="txt_lastname" Runat="server" Text='<%# DataBinder.Eval(Container.DataItem,"lastname")%>' Visible="False">
    </asp:TextBox>
    </ItemTemplate>
    </asp:TemplateColumn>
    </Columns>
    </asp:DataGrid>
    <asp:Button ID="edit" Runat="server" Text="Edit"></asp:Button>
    <asp:Button ID="update" Runat="server" Text="Update"></asp:Button>
    <asp:Button ID="del" Runat="server" Text="DelItems"></asp:Button>
    </form>
    </body>
    </HTML>
      

  5.   

    c#代码:
    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;
    namespace mydatagrid
    {
    /// <summary>
    /// mupgrid 的摘要说明。
    /// </summary>
    public class mupgrid : System.Web.UI.Page
    {
    protected System.Web.UI.WebControls.Button edit;
    protected System.Web.UI.WebControls.Button update;
    protected System.Web.UI.WebControls.DataGrid mygrid;
    protected System.Web.UI.WebControls.Button del;
    private SqlConnection conn = new SqlConnection("server=(local);uid=sa;pwd=w;database=northwind;");
    private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面
    string jsScript = "<script language=JavaScript> \n" +
    "<!--\n" +
    "function confirmDelete (frm) {\n\n" +
    " // loop through all elements\n" +
    " for (i=0; i<frm.length; i++) {\n\n" +
    " // Look for our checkboxes only\n" +
    " if (frm.elements[i].name.indexOf ('chkbox') !=-1) {\n" +
    " // If any are checked then confirm alert, otherwise nothing happens\n" +
    " if(frm.elements[i].checked) {\n" +
    " return confirm ('确认要更新记录吗?')\n" +
    " }\n" +
    " }\n" +
    " }\n" +
    "}\n\n\n" + "function select_deselectAll (chkVal, idVal) {\n" +
    "var frm = document.forms[0];\n" +
    "// loop through all elements\n" +
    " for (i=0; i<frm.length; i++) {\n" +
    " // // Look for our Header Template's Checkbox\n" +
    " if (idVal.indexOf ('chekall') != -1) {\n" +
    " // Check if main checkbox is checked, then select or deselect datagrid checkboxes \n" +
    " if(chkVal == true) {\n" +
    " frm.elements[i].checked = true;\n" +
    " } else {\n" +
    " frm.elements[i].checked = false;\n" +
    " }\n" +
    " // Work here with the Item Template's multiple checkboxes\n" +
    " } else if (idVal.indexOf('chkbox') != -1) {\n" +
    " // Check if any of the checkboxes are not checked, and then uncheck top select all checkbox\n" +
    " if(frm.elements[i].checked == false) {\n" +
    " frm.elements[1].checked = false; // Check if any of the checkboxes are not checked, and then uncheck top select all checkbox\n" +
    " }\n" +
    " }\n" +
    " }\n" +
    "}" +
    "//--> \n" +
    "</script>";
    RegisterClientScriptBlock("clientScript",jsScript);
    WebControl edit = (WebControl)Page.FindControl("update");
    edit.Attributes.Add("onclick","return confirmDelete(this.form);");

    if(!IsPostBack)
    {
    setbind();
    }
    }
    private void setbind()
    {
    conn.Open();
    SqlDataAdapter sda = new SqlDataAdapter("select employeeid,firstname,lastname from employees",conn);
    DataSet ds = new DataSet();
    sda.Fill(ds);
    mygrid.DataSource = ds.Tables[0].DefaultView;
    mygrid.DataBind();
    ds.Clear();
    sda.Dispose();
    conn.Close();

    }
    #region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {    
    this.edit.Click += new System.EventHandler(this.edit_Click);
    this.update.Click += new System.EventHandler(this.update_Click);
    this.del.Click += new System.EventHandler(this.del_Click);
    this.Load += new System.EventHandler(this.Page_Load); }
    #endregion private void edit_Click(object sender, System.EventArgs e)
    {
    foreach(DataGridItem i in mygrid.Items)
    {
    if(((CheckBox)i.FindControl("chkbox")).Checked == true)
    {
    ((TextBox)i.FindControl("txt_firname")).Visible = true;
    ((TextBox)i.FindControl("txt_lastname")).Visible = true;
    ((Label)i.FindControl("lab_firname")).Visible = false;
    ((Label)i.FindControl("lab_lastname")).Visible = false;
    i.BackColor = System.Drawing.Color.LightGreen;
    }
    }
    } private void update_Click(object sender, System.EventArgs e)
    { foreach(DataGridItem i in mygrid.Items)
    {
    if(((CheckBox)i.FindControl("chkbox")).Checked == true)
    {
    if(((TextBox)i.FindControl("txt_firname")).Text != ((Label)i.FindControl("lab_firname")).Text || ((TextBox)i.FindControl("txt_lastname")).Text != ((Label)i.FindControl("lab_lastname")).Text)
    {
    try
    {
    conn.Open();
    string sql = "update employees set firstname='"+(((TextBox)i.FindControl("txt_firname")).Text).ToString()+"',lastname='"+(((TextBox)i.FindControl("txt_lastname")).Text).ToString()+"' where employeeid = " + i.Cells[1].Text.ToString();
    SqlCommand cmd = new SqlCommand(sql,conn);
    cmd.ExecuteNonQuery();
    }
    catch(Exception ex)
    {
    Response.Write(ex);
    }
    finally
    {
    conn.Close();

    }
    //Response.Write("记录号:"+ this.mygrid.DataKeys[int.Parse(((HtmlInputHidden)i.FindControl("selectid")).Value)] + "FirstName:" + ((TextBox)i.FindControl("txt_firname")).Text + "LastName:" + ((TextBox)i.FindControl("txt_lastname")).Text + "<br>");

    }
    ((TextBox)i.FindControl("txt_firname")).Visible = false;
    ((TextBox)i.FindControl("txt_lastname")).Visible = false;
    ((Label)i.FindControl("lab_firname")).Visible = true;
    ((Label)i.FindControl("lab_lastname")).Visible = true;
    ((CheckBox)i.FindControl("chkbox")).Checked = false;
    }
    }
    setbind();
    } private void del_Click(object sender, System.EventArgs e)
    {
    string ids = "";
    bool flag = false;
    foreach(DataGridItem i in mygrid.Items)
    {
    if(((CheckBox)i.FindControl("chkbox")).Checked)
    {
    flag = true;
    ids += i.Cells[1].Text.ToString() + ",";
    }
    }
    if(flag == true)
    {
    string sql = "delete from employees where employeeid in(" + ids.Substring(0,ids.LastIndexOf(",")) +")";
    try
    {
    conn.Open();
    SqlCommand cmd = new SqlCommand(sql,conn);
    cmd.ExecuteNonQuery();

    }
    catch(Exception ex)
    {
    Response.Write(ex);
    }
    finally
    {
    conn.Close();
    setbind();
    }

    }
    }
    }
    }
      

  6.   

    因为我只能写<input type="text" value="{0}">
    我总不能写<input type="text" value="{0}" runat=server>

    <input type="text" value="{0}" name="{0}">

      

  7.   

    知道了,elivehai(wzh)提出的方案是在模板例里放了两个控件,一个是label,一个是textbox,后面默认为不显示.
      

  8.   

    你也可以用样式表来控制textbox的表示形式!那样只用textbox也可以实现你的目的
      

  9.   

    自己想的解决方案,用绑定列,字符串格式为<input type="text" value="{0}">,可是这样的结果是无法获取文本域里面的值,因为datagrid1.items[i].cell[0].text里面只会显示其原先的值,而不是你输入的值.其实用Request是可以取到值的
    <input type="text" value="{0}"> 改成
    <input type="text" name="myInput" value="{0}">
    string values=Request["myInput"];
    string[] inputs=values.Split(',');
    第i行的输入值对应inputs[i];
      

  10.   

    crazy2005(剣心)的方法也不错
    zzfloat(方舟) 
    <input type="text" value="{0}"> 改成
    <input type="text" name="myInput" value="{0}">
    string values=Request["myInput"];
    string[] inputs=values.Split(',');
    这种方法其实是行不通的
    采用了elivehai(wzh) 的方法,
    现在给分
    不过大家可以想想有没有更好的方法
      

  11.   

    如果你想即简单又美观就到网上下个第三方的DataGrid控件吧,它是支持整表编辑模式的,还可能拖拉列。
      

  12.   

    用模板列,给个command标志,在itemcomand事件里面判断,循环代码量不大
      

  13.   

    用循环判断咯,使用C1的Grid,这个还是非常的不错的。
      

  14.   

    用模板列,给个command标志,在itemcomand事件里面判断,循环代码量不大
    能否详尽
      

  15.   

    不用这么复杂吧,做个隐藏列,再做两个按钮,按编辑呢,把隐藏列打开。
    如果要编辑的列太多,索性做两个TABLE,一个管显示,一个管编辑,一按更新就切换。
      

  16.   


    =================== 注意了 最佳解决方案!! =============================
    做两个DataGrid 一个浏览用,一个编辑用。浏览用的正常的方式,编辑用的(加模版列)把TextBox“上移一行”,就是把Label换成TextBox,不知道我说明白了没有。单击按钮,切换两个DataGrid的显示。
      

  17.   

    c#代码:
    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.SessionState;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls;
    using System.Data.SqlClient;
    namespace mydatagrid
    {
    /// <summary>
    /// mupgrid 的摘要说明。
    /// </summary>
    public class mupgrid : System.Web.UI.Page
    {
    protected System.Web.UI.WebControls.Button edit;
    protected System.Web.UI.WebControls.Button update;
    protected System.Web.UI.WebControls.DataGrid mygrid;
    protected System.Web.UI.WebControls.Button del;
    private SqlConnection conn = new SqlConnection("server=(local);uid=sa;pwd=w;database=northwind;");
    private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面
    string jsScript = "<script language=JavaScript> \n" +
    "<!--\n" +
    "function confirmDelete (frm) {\n\n" +
    " // loop through all elements\n" +
    " for (i=0; i<frm.length; i++) {\n\n" +
    " // Look for our checkboxes only\n" +
    " if (frm.elements[i].name.indexOf ('chkbox') !=-1) {\n" +
    " // If any are checked then confirm alert, otherwise nothing happens\n" +
    " if(frm.elements[i].checked) {\n" +
    " return confirm ('确认要更新记录吗?')\n" +
    " }\n" +
    " }\n" +
    " }\n" +
    "}\n\n\n" + "function select_deselectAll (chkVal, idVal) {\n" +
    "var frm = document.forms[0];\n" +
    "// loop through all elements\n" +
    " for (i=0; i<frm.length; i++) {\n" +
    " // // Look for our Header Template's Checkbox\n" +
    " if (idVal.indexOf ('chekall') != -1) {\n" +
    " // Check if main checkbox is checked, then select or deselect datagrid checkboxes \n" +
    " if(chkVal == true) {\n" +
    " frm.elements[i].checked = true;\n" +
    " } else {\n" +
    " frm.elements[i].checked = false;\n" +
    " }\n" +
    " // Work here with the Item Template's multiple checkboxes\n" +
    " } else if (idVal.indexOf('chkbox') != -1) {\n" +
    " // Check if any of the checkboxes are not checked, and then uncheck top select all checkbox\n" +
    " if(frm.elements[i].checked == false) {\n" +
    " frm.elements[1].checked = false; // Check if any of the checkboxes are not checked, and then uncheck top select all checkbox\n" +
    " }\n" +
    " }\n" +
    " }\n" +
    "}" +
    "//--> \n" +
    "</script>";
    RegisterClientScriptBlock("clientScript",jsScript);
    WebControl edit = (WebControl)Page.FindControl("update");
    edit.Attributes.Add("onclick","return confirmDelete(this.form);");

    if(!IsPostBack)
    {
    setbind();
    }
    }
    private void setbind()
    {
    conn.Open();
    SqlDataAdapter sda = new SqlDataAdapter("select employeeid,firstname,lastname from employees",conn);
    DataSet ds = new DataSet();
    sda.Fill(ds);
    mygrid.DataSource = ds.Tables[0].DefaultView;
    mygrid.DataBind();
    ds.Clear();
    sda.Dispose();
    conn.Close();

    }
    #region Web 窗体设计器生成的代码
    override protected void OnInit(EventArgs e)
    {
    //
    // CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
    //
    InitializeComponent();
    base.OnInit(e);
    }

    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {    
    this.edit.Click += new System.EventHandler(this.edit_Click);
    this.update.Click += new System.EventHandler(this.update_Click);
    this.del.Click += new System.EventHandler(this.del_Click);
    this.Load += new System.EventHandler(this.Page_Load); }
    #endregion private void edit_Click(object sender, System.EventArgs e)
    {
    foreach(DataGridItem i in mygrid.Items)
    {
    if(((CheckBox)i.FindControl("chkbox")).Checked == true)
    {
    ((TextBox)i.FindControl("txt_firname")).Visible = true;
    ((TextBox)i.FindControl("txt_lastname")).Visible = true;
    ((Label)i.FindControl("lab_firname")).Visible = false;
    ((Label)i.FindControl("lab_lastname")).Visible = false;
    i.BackColor = System.Drawing.Color.LightGreen;
    }
    }
    } private void update_Click(object sender, System.EventArgs e)
    { foreach(DataGridItem i in mygrid.Items)
    {
    if(((CheckBox)i.FindControl("chkbox")).Checked == true)
    {
    if(((TextBox)i.FindControl("txt_firname")).Text != ((Label)i.FindControl("lab_firname")).Text || ((TextBox)i.FindControl("txt_lastname")).Text != ((Label)i.FindControl("lab_lastname")).Text)
    {
    try
    {
    conn.Open();
    string sql = "update employees set firstname='"+(((TextBox)i.FindControl("txt_firname")).Text).ToString()+"',lastname='"+(((TextBox)i.FindControl("txt_lastname")).Text).ToString()+"' where employeeid = " + i.Cells[1].Text.ToString();
    SqlCommand cmd = new SqlCommand(sql,conn);
    cmd.ExecuteNonQuery();
    }
    catch(Exception ex)
    {
    Response.Write(ex);
    }
    finally
    {
    conn.Close();

    }
    //Response.Write("记录号:"+ this.mygrid.DataKeys[int.Parse(((HtmlInputHidden)i.FindControl("selectid")).Value)] + "FirstName:" + ((TextBox)i.FindControl("txt_firname")).Text + "LastName:" + ((TextBox)i.FindControl("txt_lastname")).Text + "<br>");

    }
    ((TextBox)i.FindControl("txt_firname")).Visible = false;
    ((TextBox)i.FindControl("txt_lastname")).Visible = false;
    ((Label)i.FindControl("lab_firname")).Visible = true;
    ((Label)i.FindControl("lab_lastname")).Visible = true;
    ((CheckBox)i.FindControl("chkbox")).Checked = false;
    }
    }
    setbind();
    } private void del_Click(object sender, System.EventArgs e)
    {
    string ids = "";
    bool flag = false;
    foreach(DataGridItem i in mygrid.Items)
    {
    if(((CheckBox)i.FindControl("chkbox")).Checked)
    {
    flag = true;
    ids += i.Cells[1].Text.ToString() + ",";
    }
    }
    if(flag == true)
    {
    string sql = "delete from employees where employeeid in(" + ids.Substring(0,ids.LastIndexOf(",")) +")";
    try
    {
    conn.Open();
    SqlCommand cmd = new SqlCommand(sql,conn);
    cmd.ExecuteNonQuery();

    }
    catch(Exception ex)
    {
    Response.Write(ex);
    }
    finally
    {
    conn.Close();
    setbind();
    }

    }
    }
    }
    }
      

  18.   

    jyk(喜欢编程。和气生财。共同提高。共同进步)的方案:
    做两个DataGrid 一个浏览用,一个编辑用。浏览用的正常的方式,编辑用的(加模版列)把TextBox“上移一行”,就是把Label换成TextBox,不知道我说明白了没有。单击按钮,切换两个DataGrid的显示。这样也行吧。不过好像复杂点,呵呵
      

  19.   

    我们公司是结合ajax,.net重新开发了一个平台,不过投入较大
      

  20.   

    http://blogs.msdn.com/mattdotson/archive/2005/11/09/491096.aspx
      

  21.   

    使用循环也有问题,循环更新时不可以一条一条的来得使用事务来处理,要么在sql语句中使用事务,要么在程序中使用事务
      

  22.   

    编辑用的(加模版列)把TextBox“上移一行”,就是把Label换成TextBox,不知道我说明白了没有。
    没看明白