请问datagridview如何编辑单元格? 我可以在单元格里修改数据,可是保存不到数据库里,我在网上查过也测试了,用什么CommitEdit() EndEdit() 但是根本不能更新到数据库里,请问如何才能编辑?能否给出相关代码,谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 找到一个。先参考一下:http://blog.csdn.net/wuyxdream/archive/2005/07/15/425739.aspx 显示数据的时候,保存那个DATATABLEprivate 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中。因为有一段时间没有用这段代码了。可能会有遗漏。不过肯定是可行的。已经应用在某个系统中。 http://www.cnblogs.com/anderslly/archive/2006/12/07/dgvsummary.html这里可以看看 首先在使用DataTable的时候,保存对象。private DataTable dtData;void DrawData(.......){ ....... dtData=SqlConn...ExecuteDataTable("sql...."); dgGrid.DataSource=dtData; .......}为这个DataGridView添加事件:DataBindingCompleteprivate 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中保存的数据都要在一张表中保存,也就是说,抽取数据时候不能从多张表中抽出。有段时间没有用这段代码了,可能还有些限制。不过肯定能用。 首先在使用DataTable的时候,保存对象。private DataTable dtData;void DrawData(.......){ ....... dtData=SqlConn...ExecuteDataTable("sql...."); dgGrid.DataSource=dtData; .......}为这个DataGridView添加事件:DataBindingCompleteprivate 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中保存的数据都要在一张表中保存,也就是说,抽取数据时候不能从多张表中抽出。有段时间没有用这段代码了,可能还有些限制。不过肯定能用。 前面网络不好,发了两次代码里面的SqlLog("UpdateDataTable(" + pTargetTable.ToString() + "," + pTableName + ")"); 是过去用的记录SQL信息的日志代码,可以忽略。 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是我定义的操作类。你看下就知道原理了。 因为这是抽象出来的DLL,所以使用到了部分局部变量:_ConnectionString一看就知道是连接字符。呵呵。修改这段代码的话,再加个连接字符串就可以了。 to: dyshadow qlDataAdapter.Update(changedElements);更新的时候这句报错:将参数值从 String 转换到 Int32 失败。怎么解决呢? 这个我没有办法看你程序啊...没有办法具体找问题了.你看下TABLE的结构有没有问题,主键什么的.能否贴一下sqlDataAdapter.UpdateCommand的值?我用这个方法成功更新过VARCHAR,CHAR,NUMERIC的字段,应该没有问题的. 我测试了,如果主键是int型的时候就OK,如果是char(6)的时候就报错:将参数值从 String 转换到 Int32 失败。 先保存到DataSet,再保存到数据库不行吗?你说的问题我做过,不难吧!不知道你要实现什么效果。 //更新 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(); }不行,再把你写的贴出来 楼上的朋友搞错了,我问的是datagridview控件,不是gridview to: dyshadow 如果主键是int型的时候就OK,如果是char(6)的时候就报错:将参数值从 String 转换到 Int32 失败。 不是太清楚你最终要达到什么效果 试一下 说明如下环境: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中也被更新了以上 希望对楼主有所帮助。 给TableAdapter添加一个Update查询 UpdateBy** 直接用TableAdapter.UpdateBy**更新数据库不行吗? to: dyjqk 我测试下来没有问题的啊,Char(6)的主键也完全没有问题.给我你的邮箱,我把basefunction.dll和测试用程序的代码发给你. 如果用的是DataAdapter绑定数据源的话,可以用Update()方法 我想问个问题,datagridview在双击修改的时候,是不是也会修改数据集里面的数据?,如果是的话,那是不是可以直接用数据集DATASET里面的表进行操作? 新手,正在做这个,有这个疑问 求解答~! ftp上传问题 如何在flash控件中播放flash文件时,将flash的播放方式设置成Movie模式的,而不是 game模式的 数据库连接,异步操作 请教!!!,这个构造函数哪里有问题???? 请教高手啊,能解决小弟感激不尽,送上100分表示感谢!!!!! npoi C#如何做一个资源管理器???有代码的拿走这100分. c#中如何将字符串表达式转换成逻辑表达式 无边框窗体,阴影不完整 C#读取TXT文件在dataGridView显示。 如何使用C#开发Google Earth 最speed的方法从0~9,10个数字中随即抽取6个数字,生成一万个不重复的数
http://blog.csdn.net/wuyxdream/archive/2005/07/15/425739.aspx
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中。
因为有一段时间没有用这段代码了。可能会有遗漏。不过肯定是可行的。已经应用在某个系统中。
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中保存的数据都要在一张表中保存,也就是说,抽取数据时候不能从多张表中抽出。有段时间没有用这段代码了,可能还有些限制。不过肯定能用。
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中保存的数据都要在一张表中保存,也就是说,抽取数据时候不能从多张表中抽出。有段时间没有用这段代码了,可能还有些限制。不过肯定能用。
是过去用的记录SQL信息的日志代码,可以忽略。
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是我定义的操作类。你看下就知道原理了。
一看就知道是连接字符。呵呵。
修改这段代码的话,再加个连接字符串就可以了。
你看下TABLE的结构有没有问题,主键什么的.
能否贴一下sqlDataAdapter.UpdateCommand的值?
我用这个方法成功更新过VARCHAR,CHAR,NUMERIC的字段,应该没有问题的.
//更新
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();
}不行,再把你写的贴出来
环境:
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中也被更新了
以上 希望对楼主有所帮助。
我测试下来没有问题的啊,Char(6)的主键也完全没有问题.给我你的邮箱,我把basefunction.dll和测试用程序的代码发给你.
新手,正在做这个,有这个疑问 求解答~!