我可以在单元格里修改数据,可是保存不到数据库里,我在网上查过也测试了,用什么CommitEdit() EndEdit() 但是根本不能更新到数据库里,请问如何才能编辑?能否给出相关代码,谢谢!

解决方案 »

  1.   

    找到一个。先参考一下:
    http://blog.csdn.net/wuyxdream/archive/2005/07/15/425739.aspx
      

  2.   

    显示数据的时候,保存那个DATATABLE
    private dtTable;....
    dtTable=....ExecuteDataTable(....);
    grdTest.DataSource=dtTable;
    ....
    我做了个函数专门用于DATAGRIDVIEW的数据保存,如下这里是关键:
    public bool UpdateDataTable(ref DataTable pTargetTable, string pTableName)
            {
                SqlLog("UpdateDataTable(" + pTargetTable.ToString() + "," + pTableName + ")");
                try
                {
                    DataTable changedElements = null;
                    changedElements = pTargetTable.GetChanges();
                    if (changedElements != null)
                    {
                        using (SqlConnection sqlConn = new SqlConnection(_ConnectionString))
                        {
                            sqlConn.Open();
                            SqlDataAdapter sqlDataAdapter = new SqlDataAdapter("SELECT * FROM " + pTableName, sqlConn);
                            SqlCommandBuilder sqlCommandBuilder = new SqlCommandBuilder(sqlDataAdapter);
                            sqlDataAdapter.InsertCommand = sqlCommandBuilder.GetInsertCommand();
                            sqlDataAdapter.UpdateCommand = sqlCommandBuilder.GetUpdateCommand();
                            sqlDataAdapter.DeleteCommand = sqlCommandBuilder.GetDeleteCommand();
                            sqlDataAdapter.Update(changedElements);
                            pTargetTable.AcceptChanges();
                        }
                    }
                    return true;
                }
                catch (Exception e)
                {
                    ErrorProcess(e);
                    return false;
                }
            }之后,在DATAGRIDVIEW的DataBindingComplete事件中添加代码:
    UpdateDataTable(ref dtTable, <对象表>);这样就可以了。DataBindingComplete事件有时候并不稳定,你可以测试一下。
    以上只实现了SQL连接,OLE也大同小异。注意,第一,只能对有主键的表进行更新,其次,任何一个字段都应该在同一个TABLE中。
    因为有一段时间没有用这段代码了。可能会有遗漏。不过肯定是可行的。已经应用在某个系统中。
      

  3.   

    http://www.cnblogs.com/anderslly/archive/2006/12/07/dgvsummary.html这里可以看看
      

  4.   

    首先在使用DataTable的时候,保存对象。
    private DataTable dtData;
    void DrawData(.......)
    {
      .......
      dtData=SqlConn...ExecuteDataTable("sql....");
      dgGrid.DataSource=dtData;
      .......
    }
    为这个DataGridView添加事件:DataBindingComplete
    private void dgGrid_DataBindingComplete(................)
    {
      UpdateDataTable(ref dtData,"TBL_TheTable")
    }以下是关键:
            public bool UpdateDataTable(ref DataTable pTargetTable, string pTableName)
            {
                SqlLog("UpdateDataTable(" + pTargetTable.ToString() + "," + pTableName + ")");
                try
                {
                    DataTable changedElements = null;
                    changedElements = pTargetTable.GetChanges();
                    if (changedElements != null)
                    {
                        using (SqlConnection sqlConn = new SqlConnection(_ConnectionString))
                        {
                            sqlConn.Open();
                            SqlDataAdapter sqlDataAdapter = new SqlDataAdapter("SELECT * FROM " + pTableName, sqlConn);
                            SqlCommandBuilder sqlCommandBuilder = new SqlCommandBuilder(sqlDataAdapter);
                            sqlDataAdapter.InsertCommand = sqlCommandBuilder.GetInsertCommand();
                            sqlDataAdapter.UpdateCommand = sqlCommandBuilder.GetUpdateCommand();
                            sqlDataAdapter.DeleteCommand = sqlCommandBuilder.GetDeleteCommand();
                            sqlDataAdapter.Update(changedElements);
                            pTargetTable.AcceptChanges();
                        }
                    }
                    return true;
                }
                catch (Exception e)
                {
                    ErrorProcess(e);
                    return false;
                }
            }
    如此这般就可以了。不过还有限制,1、对象表需要有主键确保数据唯一性,2、所有在DataTable中保存的数据都要在一张表中保存,也就是说,抽取数据时候不能从多张表中抽出。有段时间没有用这段代码了,可能还有些限制。不过肯定能用。
      

  5.   

    首先在使用DataTable的时候,保存对象。
    private DataTable dtData;
    void DrawData(.......)
    {
      .......
      dtData=SqlConn...ExecuteDataTable("sql....");
      dgGrid.DataSource=dtData;
      .......
    }
    为这个DataGridView添加事件:DataBindingComplete
    private void dgGrid_DataBindingComplete(................)
    {
      UpdateDataTable(ref dtData,"TBL_TheTable")
    }以下是关键:
            public bool UpdateDataTable(ref DataTable pTargetTable, string pTableName)
            {
                SqlLog("UpdateDataTable(" + pTargetTable.ToString() + "," + pTableName + ")");
                try
                {
                    DataTable changedElements = null;
                    changedElements = pTargetTable.GetChanges();
                    if (changedElements != null)
                    {
                        using (SqlConnection sqlConn = new SqlConnection(_ConnectionString))
                        {
                            sqlConn.Open();
                            SqlDataAdapter sqlDataAdapter = new SqlDataAdapter("SELECT * FROM " + pTableName, sqlConn);
                            SqlCommandBuilder sqlCommandBuilder = new SqlCommandBuilder(sqlDataAdapter);
                            sqlDataAdapter.InsertCommand = sqlCommandBuilder.GetInsertCommand();
                            sqlDataAdapter.UpdateCommand = sqlCommandBuilder.GetUpdateCommand();
                            sqlDataAdapter.DeleteCommand = sqlCommandBuilder.GetDeleteCommand();
                            sqlDataAdapter.Update(changedElements);
                            pTargetTable.AcceptChanges();
                        }
                    }
                    return true;
                }
                catch (Exception e)
                {
                    ErrorProcess(e);
                    return false;
                }
            }
    如此这般就可以了。不过还有限制,1、对象表需要有主键确保数据唯一性,2、所有在DataTable中保存的数据都要在一张表中保存,也就是说,抽取数据时候不能从多张表中抽出。有段时间没有用这段代码了,可能还有些限制。不过肯定能用。
      

  6.   

    前面网络不好,发了两次代码里面的SqlLog("UpdateDataTable(" + pTargetTable.ToString() + "," + pTableName + ")"); 
    是过去用的记录SQL信息的日志代码,可以忽略。
      

  7.   

                dal.Class = ((TextBox)GridView1.FooterRow.FindControl("txtclass1")).Text;
                dal.content = ((TextBox)GridView1.FooterRow.FindControl("txtcontent1")).Text;
                dal.StartDate = ((TextBox)GridView1.FooterRow.FindControl("txtstartdate1")).Text;
                dal.EndDate = ((TextBox)GridView1.FooterRow.FindControl("txtenddate1")).Text;
                dal.IsFinish = ((TextBox)GridView1.FooterRow.FindControl("txtfinish1")).Text;
                dal.DanWei = ((TextBox)GridView1.FooterRow.FindControl("txtdanwei1")).Text;
                dal.Peple = ((TextBox)GridView1.FooterRow.FindControl("txtpeple1")).Text;
                dal.BeiZu = ((TextBox)GridView1.FooterRow.FindControl("txtbeizu1")).Text;
                dal.IsJoin = ((DropDownList)GridView1.FooterRow.FindControl("ddlsjoin")).SelectedItem.Text;
            dal.Writer = Session["姓名"].ToString();
            dal.GongHao = Session["工号"].ToString();
            dal.Update();
    dal是我定义的操作类。你看下就知道原理了。
      

  8.   

    因为这是抽象出来的DLL,所以使用到了部分局部变量:_ConnectionString
    一看就知道是连接字符。呵呵。
    修改这段代码的话,再加个连接字符串就可以了。
      

  9.   

    to: dyshadow qlDataAdapter.Update(changedElements);更新的时候这句报错:将参数值从 String 转换到 Int32 失败。怎么解决呢?
      

  10.   

    这个我没有办法看你程序啊...没有办法具体找问题了.
    你看下TABLE的结构有没有问题,主键什么的.
    能否贴一下sqlDataAdapter.UpdateCommand的值?
    我用这个方法成功更新过VARCHAR,CHAR,NUMERIC的字段,应该没有问题的.
      

  11.   

    我测试了,如果主键是int型的时候就OK,如果是char(6)的时候就报错:将参数值从 String 转换到 Int32 失败。
      

  12.   

    先保存到DataSet,再保存到数据库不行吗?你说的问题我做过,不难吧!不知道你要实现什么效果。
      

  13.   


    //更新
        protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            sqlcon = new SqlConnection(strCon);
            string sqlstr = "update 表 set 字段1='"
                + ((TextBox)(GridView1.Rows[e.RowIndex].Cells[1].Controls[0])).Text.ToString().Trim() + "',字段2='"
                + ((TextBox)(GridView1.Rows[e.RowIndex].Cells[2].Controls[0])).Text.ToString().Trim() + "',字段3='"
                + ((TextBox)(GridView1.Rows[e.RowIndex].Cells[3].Controls[0])).Text.ToString().Trim() + "' where id='" 
                + GridView1.DataKeys[e.RowIndex].Value.ToString() + "'";
            sqlcom=new SqlCommand(sqlstr,sqlcon);
            sqlcon.Open();
            sqlcom.ExecuteNonQuery();
            sqlcon.Close();
            GridView1.EditIndex = -1;
            bind();
        }不行,再把你写的贴出来
      

  14.   

    楼上的朋友搞错了,我问的是datagridview控件,不是gridview
      

  15.   

    to: dyshadow  如果主键是int型的时候就OK,如果是char(6)的时候就报错:将参数值从 String 转换到 Int32 失败。
      

  16.   

    不是太清楚你最终要达到什么效果 试一下 说明如下
    环境:
    visual 2005 c# 
    sqlserver2005    首先db中建立一个表Table1 有两个字段 id 和 name在form上添加一个datagridview
    然后编辑datagridview属性的[DataSource], 将datagridview和表table1进行了绑定。
    这之后会出现一个xsd类型的文件 双击该文件 可以在属性中对UpdateCommand进行编辑
    例:
    UPDATE   Table1  SET  name = @name   WHERE id = @id)这样在该form的load事件中就自动出现了如下类似代码
    this.XXXAdapter.Fill(this.XXXDataSet.Table1);在form上在添加一个save按钮 然后编辑单击事件 添加如下代码
    this.XXXAdapter.Update(this.XXXDataSet.Table1);注: XXX会根据你命名的不同有所区别最终效果: 
    运行打开画面,会把数据库中该标的所有数据显示在画面上 
    修改了name的值,然后按下save按钮 db中也被更新了
    以上 希望对楼主有所帮助。
     
      

  17.   

    给TableAdapter添加一个Update查询 UpdateBy** 直接用TableAdapter.UpdateBy**更新数据库不行吗?
      

  18.   

    to: dyjqk 
    我测试下来没有问题的啊,Char(6)的主键也完全没有问题.给我你的邮箱,我把basefunction.dll和测试用程序的代码发给你.
      

  19.   

    如果用的是DataAdapter绑定数据源的话,可以用Update()方法
      

  20.   

    我想问个问题,datagridview在双击修改的时候,是不是也会修改数据集里面的数据?,如果是的话,那是不是可以直接用数据集DATASET里面的表进行操作?  
    新手,正在做这个,有这个疑问  求解答~!