我在如下的帖子提出的问题:在GridView控件中,如何双击或单击一行就可以编辑此行的数据,已经得到解决了:
http://topic.csdn.net/u/20080321/19/7bcd47aa-a30f-49b9-8f5f-06a2858f69a8.html
不过又产生一个问题了,双击修改完,要点击此行的“保存”按钮才能保存,能不能在双击其它行的时候,系统检测是否此行已经发生变化,如果是则自动保存,否则直接转入其它行的编辑状态。这样操作起来比较人性化。

解决方案 »

  1.   

    虽然我也刚开始学asp.net 2.0 ,但我相信gridview自带的方法事件一定可以实现这个功能,不过个人对这个有点难以理解,如果一条一条大批量修改了,效率会不会很低?
      

  2.   

    能不能在双击其它行的时候,系统检测是否此行已经发生变化,如果是则自动保存,否则直接转入其它行的编辑状态。 你再放个bool变量来保存状态不就可以了
      

  3.   

    可不可以用SelectedIndexChanged事件呢?
      

  4.   

    双击其它行的状态,只能判断新行的行ID,离开行的行ID如何获得,保存到ViewState中?哪如何记取离开行的还没有保存到数据库的数据?
      

  5.   

    你可以去找一找GridView中类似于SelectedIndexChanged事件
    那个事件的名称我也不记得了,你自己去找找
      

  6.   

    在双击的时候,遍历下gridview全部保存不就可以了,不过这样是麻烦
      

  7.   

    当编辑一行时,点击另外一行编辑时,考不考虑页面刷新的问题?
    应该都可以实现,如果想要页面不刷新,使用Ajax,如果不考虑,不用Ajax也是可以的
      

  8.   

    http://blog.csdn.net/JustLovePro/archive/2008/04/07/2257180.aspx----
    不知道这样的效果lz喜欢不?
    可以参考下
      

  9.   

    楼主可以到我的博客里看一下这个文章,里面有详细的代码,是借鉴晓风残月的。http://blog.csdn.net/oyjd614/archive/2007/09/24/1798926.aspx
      

  10.   

    test.aspx,注意你修改过aspx名称时,对应的js代码也要改过来,要不就404错误了
    <%@ Page Language="C#" debug="true"%>
    <%@ Import Namespace="System.Data" %>
    <script runat="server">
            protected void Page_Load(object sender, EventArgs e)
            {
                bool isAJAXPost = IsAJAXPost();
                if (isAJAXPost)//是
                {
                    Response.Write("AJAX PostBack Data\nName:" + Request.Form["name"]
                        + "\nNumber:" + Request.Form["number"]
                        + "\nServerTime:" + DateTime.Now.ToString());//提供给ajax对象使用的信息
                    Response.End();//结束下面程序的执行
                }         
                if (!IsPostBack)
                {
                    GridView1.DataSource = BuildGridViewDataSource();
                    GridView1.DataBind();
                }
            }
        /// <summary>
        /// 是否是ajaxpost回来的数据,并根据数据更新表什么的
        /// </summary>
        /// <returns>是否是ajax提交的数据</returns>
            private bool IsAJAXPost()
            {
                string Up = Request.Form["up"];
                if (Up == "up")//此参数执行是否是ajax post回来的
                {
                    string Name = Request.Form["name"];
                    string Number = Request.Form["Number"];
                    //下面可以执行你的更新操作什么的
                    //======
                    //======
                    return true;//返回 
                }
                return false;
            }
            /// <summary>
            /// 用来做例子中的数据源
            /// </summary>
            /// <returns></returns>
            private DataTable BuildGridViewDataSource()
            {
                DataTable dt = new DataTable();
                dt.Columns.Add("Number");
                dt.Columns.Add("Name");            DataRow dr = dt.NewRow();
                dr["Number"] = "1000";
                dr["Name"] = "张三";
                dt.Rows.Add(dr);            dr = dt.NewRow();
                dr["Number"] = "1001";
                dr["Name"] = "李四";
                dt.Rows.Add(dr);            return dt;
            }
            protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
            {
                if (e.Row.RowType == DataControlRowType.DataRow)
                {
                    //实现单击时确发编辑
                    //e.Row.Attributes.Add("onclick", "OnClickedRow('" + e.Row.RowIndex + "');");
                    //实现双击时确发编辑
                    e.Row.Attributes.Add("ondblclick", "OnClickedRow(this);");
                }
            }  
    </script>
    <html>
      <head></head>
      <body>
      <form runat="server">
      <asp:GridView Width="500" ID="GridView1" runat="server" AutoGenerateColumns="False"
                    OnRowDataBound="GridView1_RowDataBound">
                    <Columns>
                        <asp:BoundField DataField="Number" HeaderText="编号" />
                        <asp:BoundField DataField="Name" HeaderText="姓名" />
                    </Columns>
                </asp:GridView>  </form>
      <script type="text/javascript">
      var FocusTR=null;
     function createObj()
    {
      var o=null;
      if(typeof(XMLHttpRequest)!="undefined") return new XMLHttpRequest();//ie7和w3c
      if(window.ActiveXObject)//ie6-
      {
        var MSXML=["MSXML2.XMLHttp.5.0","MSXML2.XMLHttp.4.0","MSXML2.XMLHttp.3.0","MSXML2.XMLHttp","Microsoft.XMLHTTP"];
        for(var i=0;i<MSXML.length;i++)
        {
           try
           {
             o= new ActiveXObject(MSXML[i]);
             return o;
           }
           catch(e)
           {}
        }
      }
    }
    function OnClickedRow(tr)
    {
       if(FocusTR==tr)return;//已经获取编辑状态后再双击退出
       if(FocusTR!=null)//ajax提交上次编辑行的数据
       {
          var txt1=FocusTR.cells[0].getElementsByTagName("input")[0].value;
          var txt2=FocusTR.cells[1].getElementsByTagName("input")[0].value;      
          var data="up=up&name="+escape(txt1)+"&number="+escape(txt2);
          PostData(data);//启动ajax对象来post数据回服务器提供更新
          //=========还原状态
          FocusTR.cells[0].innerHTML=txt1;
          FocusTR.cells[1].innerHTML=txt2;
       }
       var c1=tr.cells[0].innerHTML;
       var c2=tr.cells[1].innerHTML;
       //更换为text
       tr.cells[0].innerHTML="<input type='text' value='"+c1+"'/>";
       tr.cells[1].innerHTML="<input type='text' value='"+c2+"'/>";
       FocusTR=tr;//更改行
    }
    function PostData(data)
    {
      var o=createObj();
      if(o)
      {
        o.onreadystatechange=function()
        {
          if(o.readyState==4)//已经返回
          {
             if(o.status==200)//成功返回
               alert(o.responseText);
             else
               alert("发生错误!");
          }
        }
        //aspx文件名改后注意修改这个
        o.open("post","test.aspx",true);
        o.setRequestHeader("content-type","application/x-www-form-urlencoded");//post时需要设置此头
        o.send(data);//发送请求和数据
      }
      else
        alert("创建对象失败!");
    }
      </script>
      </body>
    </html>
      

  11.   

    太简单了,给个例子你,赖得复制代码。http://www.chinabs.net/showtopic-273.aspx