1DataGridView中直接增删改查的方法—追加了复制粘贴功能在VB.NET或C#中对于直接增删改DataGridView中的记录,用户更易接受,虽然DataGridView本身提供Update的方法(该仅需有Select语句即可)可将添加或删除或更新的的记录同时更新至底层数据库,但该方法模拟Excel的操作,如用户未点击保存按钮,用户此前所做的添加修改或更新的操作无法反映到底层数据库,若此时有别的用户也在访问该表格,系统所显示的还是旧的数据而不是最新的;另外系统所提供的Update方法仅适用于单表查询结果的操作,而对于关联表查询的操作则无能为力。下面的提供的方法所有的操作必须要手动完成,select,update,delete,insert的语句全部有编程人员手动加入。在DataGridView中可通过其本身直接增加记录,修改记录,以及删除记录。为了保证修改及删除的功能正常运行,数据库在设计表时必须要添加自动编号ID。添加记录:一般添加时,用Insert方法可模拟向数据库添加空白记录,以获取数据库的自动编号,随后利用修改功能输入其他字段的数据。修改记录:修改记录时利用DataGridiView的CellEndEdit事件直接修改,每修改完一个单元格即触发该事件,该事件再调用Update方法更新到数据库中的记录。避免数据库表中添加了新的字段而必须修改Update的sql语句。删除记录:有了ID后,删除记录也变得更简单,只需将所有欲删除的记录选中,最后由数据库的Delete方法删除选择的记录。以上方法每一次动作均直接与数据库关联,保证数据库中的数据都是最新的,一般对于局域网中的操作比较合适。直接上项目:将DataGridView控件拉入窗体中,打开其属性,修改AllowUserToAddRows与AllowUserToDeleteRows均为False,如下图。.同时必须将下面的删除和添加按钮删除,加入自己的删除按钮和添加按钮。表中灰色ID列为不能修改,而其余的列修改即保存。2具体代码如下:ImportsSystem.dataImportsSystem.data.sqlclientPublicClassfrmDataGridViewPast#Region定义变量PrivateconnAsNewSqlConnection(server=server;database=dbtest;uid=sa;pwd=sa)PrivatedaAsNewSqlDataAdapter()PrivatetblAsNewDataTablePrivatesqlAsString=PrivatecmdAsNewSqlCommand#EndRegion#Region初始加载PrivateSubInitLoad()'初始加载程序TryMe.Cursor=Cursors.WaitCursor'打开连接conn.Open()sql=selectID,Number,[Name],age,gender,Address,Telphone,Emailfromnametablecmd.Connection=conncmd.CommandText=sqlcmd.CommandType=CommandType.Textda.SelectCommand=cmdtbl.Clear()tbl=NewDataTableda.Fill(tbl)'定义绑定数据源,以便DataGridview和BindingNavigator享用同一数据源。DimbindSrcAsNewBindingSourcebindSrc.DataSource=tblMe.dg1.DataSource=bindSrcbdnv1.BindingSource=bindSrc'将DataGridView的列宽设定为所有单元格,每列的宽度以该列中最宽单元格宽度为准显示3'该方法不会关闭手动调整列宽的功能.dg1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells)'由于ID是由数据库自动生成的数据,所以此处将其改为只读,不能让用户修改该列内容,而其他的列均可修改。dg1.Columns(0).ReadOnly=Truedg1.Columns(0).DefaultCellStyle.BackColor=Color.LightGrayCatchexAsException'遇到问题就报系统错误!MsgBox(ex.Message)FinallyMe.Cursor=Cursors.Defaultconn.Close()EndTryEndSubPrivateSubfrmDataGridViewPast_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.LoadInitLoad()EndSub#EndRegion#Region添加新数据'注意:此处模拟添加数据给表,只是为了得到一个数据库自动的ID番号,输入后即可按更新的方法直接输入数据PrivateSubtsBtnAddNew_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlestsBtnAddNew.ClickTryMe.Cursor=Cursors.WaitCursorconn.Open()sql=Insertintonametable(Number)values('')'仅输入空值,只为能获得数据库的自动ID番号cmd=NewSqlCommandcmd.Connection=conncmd.CommandType=CommandType.Textcmd.CommandText=sqlcmd.ExecuteNonQuery()'此处直接将数据保存到底层数据库中CatchexAsExceptionMsgBox(ex.Message)Finally4Me.Cursor=Cursors.Defaultconn.Close()EndTry'添加完成后再将数据重新加载InitLoad()'并且每次输入后,总是将最新输入的记录显示在表的最后部分.dg1.FirstDisplayedScrollingRowIndex=dg1.RowCount-1EndSub#EndRegion#Region删除表中选择的数据PrivateFunctiongetDeleteID()AsInteger()'为了方便以后移植到底层类所以此处特将选中的ID先保存至本地数组中DimID()AsIntegerReDimID(dg1.SelectedRows.Count)ForiAsInteger=0Todg1.SelectedRows.Count-1ID(i)=CInt(dg1.SelectedRows(i).Cells(0).Value)NextReturnIDEndFunctionPrivateSubDeleteData()'该方法可同时删除连续选择的多行记录。'删除数据以表中的ID番号为准,删除时先删除底层的数据然后删除表中的数据'注意;删除时必须选择整行的数据TryMe.Cursor=Cursors.WaitCursorconn.Open()'删除时从ID的数组中取出该ID,再按该ID番号删除底层数据库中的记录DimID()AsInteger=getDeleteID()ForiAsInteger=0ToID.Length-1sql=deletefromnameTablewhereID='&ID(i)&'cmd=NewSqlCommandcmd.Connection=conncmd.CommandType=CommandType.Textcmd.CommandText=sqlcmd.ExecuteNonQuery()Next5'删除数据库记录后再删除界面中的记录DimxAsInteger=dg1.SelectedRows.CountWhilex0dg1.Rows.RemoveAt(dg1.SelectedRows(x-1).Index)x-=1EndWhileCatchexAsExceptionMsgBox(ex.Message)FinallyMe.Cursor=Cursors.Defaultconn.Close()EndTryEndSubPrivateSubtsBtnDelete_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlestsBtnDelete.ClickDeleteData()EndSub#EndRegion#Region修改表中数据直接保存到数据库相应表中PrivateSubdg1_CellEndEdit(ByValsenderAsSystem.Object,ByValeAsSystem.Windows.Forms.DataGridViewCellEventArgs)Handlesdg1.CellEndEdit'当表中的记录有修改时可直接将当前的数据保存至底层数据库中TryMe.Cursor=Cursors.WaitCursorconn.Open()DimIDAsInteger=CInt(dg1.CurrentRow.Cells(0).Value.ToString)'一般表的首列为ID,每次有改动时均以ID作为条件DimUpdateFieldNameAsString=dg1.Columns(e.ColumnIndex).Name.ToString'修改时以当前单元格的列名为字段名,DimUpdateValueAsString=dg1.CurrentCell.Value.ToString'修改后的当前值作为保存到数据库的值,因使用了字段名称直接等于值的方式,今后数据库表中即使添加了字段也不必在此处添加新的字段,程序自动会根据DataGridView的字段名及输入后的值直接保存至数据库。sql=Updatenametableset&UpdateFieldName&='&UpdateValue&'whereID=&ID&cmd=NewSqlCommandcmd.Connection=conncmd.CommandType=CommandType.Text6cmd.CommandText=sqlcmd.ExecuteNonQuery()'此处直接将数据保存到底层数据库中CatchexAsExceptionMsgBox(ex.Message)FinallyMe.Cursor=Cursors.Defaultconn.Close()EndTryEndSub#EndRegion#Region刷新数据PrivateSubtsBtnRefresh_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlestsBtnRefresh.ClickInitLoad()EndSub#EndRegion’------------------------------------―――――――――――-------‘新添加了复制粘贴功能#Region表格复制粘贴功能'关于DataGridView的复制和粘贴一直很困扰,因为要每次粘贴好后,还要能直接保存到数据库表中,所以采取了'以行为单位作为复制源,粘贴时可选取多行一起粘贴,当然所有的数据均会保存至数据库,保存时以表的ID'番号为准。'首先加入快捷菜单,命名为ctMnuForDg1,并添加两子菜单,复制(&C)和粘贴(&P),7'复制按钮PrivateSubtsMnuCopy_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlestsMnuCopy.Click'注意,选择数据源时,只能选择一行,但同时可选择多个单元格