DataGridView的增删改及复制粘贴.docx

上传人:b****2 文档编号:12632752 上传时间:2023-04-21 格式:DOCX 页数:14 大小:114.53KB
下载 相关 举报
DataGridView的增删改及复制粘贴.docx_第1页
第1页 / 共14页
DataGridView的增删改及复制粘贴.docx_第2页
第2页 / 共14页
DataGridView的增删改及复制粘贴.docx_第3页
第3页 / 共14页
DataGridView的增删改及复制粘贴.docx_第4页
第4页 / 共14页
DataGridView的增删改及复制粘贴.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

DataGridView的增删改及复制粘贴.docx

《DataGridView的增删改及复制粘贴.docx》由会员分享,可在线阅读,更多相关《DataGridView的增删改及复制粘贴.docx(14页珍藏版)》请在冰豆网上搜索。

DataGridView的增删改及复制粘贴.docx

DataGridView的增删改及复制粘贴

DataGridView中直接增删改查的方法—追加了复制粘贴功能

在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列为不能修改,而其余的列修改即保存。

具体代码如下:

ImportsSystem.data

ImportsSystem.data.sqlclient

PublicClassfrmDataGridViewPast

#Region"定义变量"

PrivateconnAsNewSqlConnection("server=server;database=dbtest;uid=sa;pwd=sa")

PrivatedaAsNewSqlDataAdapter()

PrivatetblAsNewDataTable

PrivatesqlAsString=""

PrivatecmdAsNewSqlCommand

#EndRegion

#Region"初始加载"

PrivateSubInitLoad()

'初始加载程序

Try

Me.Cursor=Cursors.WaitCursor

'打开连接

conn.Open()

sql="selectID,Number,[Name],age,gender,Address,Telphone,Emailfromnametable"

cmd.Connection=conn

cmd.CommandText=sql

cmd.CommandType=CommandType.Text

da.SelectCommand=cmd

tbl.Clear()

tbl=NewDataTable

da.Fill(tbl)

'定义绑定数据源,以便DataGridview和BindingNavigator享用同一数据源。

DimbindSrcAsNewBindingSource

bindSrc.DataSource=tbl

Me.dg1.DataSource=bindSrc

bdnv1.BindingSource=bindSrc

'将DataGridView的列宽设定为所有单元格,每列的宽度以该列中最宽单元格宽度为准显示

'该方法不会关闭手动调整列宽的功能.

dg1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells)

'由于ID是由数据库自动生成的数据,所以此处将其改为只读,不能让用户修改该列内容,而其他的列均可修改。

dg1.Columns(0).ReadOnly=True

dg1.Columns(0).DefaultCellStyle.BackColor=Color.LightGray

CatchexAsException

'遇到问题就报系统错误!

MsgBox(ex.Message)

Finally

Me.Cursor=Cursors.Default

conn.Close()

EndTry

EndSub

PrivateSubfrmDataGridViewPast_Load(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesMyBase.Load

InitLoad()

EndSub

#EndRegion

#Region"添加新数据"

'注意:

此处模拟添加数据给表,只是为了得到一个数据库自动的ID番号,输入后即可按更新的方法直接输入数据

PrivateSubtsBtnAddNew_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlestsBtnAddNew.Click

Try

Me.Cursor=Cursors.WaitCursor

conn.Open()

sql="Insertintonametable(Number)values('')"'仅输入空值,只为能获得数据库的自动ID番号

cmd=NewSqlCommand

cmd.Connection=conn

cmd.CommandType=CommandType.Text

cmd.CommandText=sql

cmd.ExecuteNonQuery()'此处直接将数据保存到底层数据库中

CatchexAsException

MsgBox(ex.Message)

Finally

Me.Cursor=Cursors.Default

conn.Close()

EndTry

'添加完成后再将数据重新加载

InitLoad()

'并且每次输入后,总是将最新输入的记录显示在表的最后部分.

dg1.FirstDisplayedScrollingRowIndex=dg1.RowCount-1

EndSub

#EndRegion

#Region"删除表中选择的数据"

PrivateFunctiongetDeleteID()AsInteger()

'为了方便以后移植到底层类所以此处特将选中的ID先保存至本地数组中

DimID()AsInteger

ReDimID(dg1.SelectedRows.Count)

ForiAsInteger=0Todg1.SelectedRows.Count-1

ID(i)=CInt(dg1.SelectedRows(i).Cells(0).Value)

Next

ReturnID

EndFunction

PrivateSubDeleteData()

'该方法可同时删除连续选择的多行记录。

'删除数据以表中的ID番号为准,删除时先删除底层的数据然后删除表中的数据

'注意;删除时必须选择整行的数据

Try

Me.Cursor=Cursors.WaitCursor

conn.Open()

'删除时从ID的数组中取出该ID,再按该ID番号删除底层数据库中的记录

DimID()AsInteger=getDeleteID()

ForiAsInteger=0ToID.Length-1

sql="deletefromnameTablewhereID='"&ID(i)&"'"

cmd=NewSqlCommand

cmd.Connection=conn

cmd.CommandType=CommandType.Text

cmd.CommandText=sql

cmd.ExecuteNonQuery()

Next

 

'删除数据库记录后再删除界面中的记录

DimxAsInteger=dg1.SelectedRows.Count

Whilex>0

dg1.Rows.RemoveAt(dg1.SelectedRows(x-1).Index)

x-=1

EndWhile

CatchexAsException

MsgBox(ex.Message)

Finally

Me.Cursor=Cursors.Default

conn.Close()

EndTry

EndSub

PrivateSubtsBtnDelete_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlestsBtnDelete.Click

DeleteData()

EndSub

#EndRegion

#Region"修改表中数据直接保存到数据库相应表中"

PrivateSubdg1_CellEndEdit(ByValsenderAsSystem.Object,ByValeAsSystem.Windows.Forms.DataGridViewCellEventArgs)Handlesdg1.CellEndEdit

'当表中的记录有修改时可直接将当前的数据保存至底层数据库中

Try

Me.Cursor=Cursors.WaitCursor

conn.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=NewSqlCommand

cmd.Connection=conn

cmd.CommandType=CommandType.Text

cmd.CommandText=sql

cmd.ExecuteNonQuery()'此处直接将数据保存到底层数据库中

CatchexAsException

MsgBox(ex.Message)

Finally

Me.Cursor=Cursors.Default

conn.Close()

EndTry

EndSub

#EndRegion

#Region"刷新数据"

PrivateSubtsBtnRefresh_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlestsBtnRefresh.Click

InitLoad()

EndSub

#EndRegion

 

’------------------------------------―――――――――――-------

‘新添加了复制粘贴功能

#Region"表格复制粘贴功能"

'关于DataGridView的复制和粘贴一直很困扰,因为要每次粘贴好后,还要能直接保存到数据库表中,所以采取了

'以行为单位作为复制源,粘贴时可选取多行一起粘贴,当然所有的数据均会保存至数据库,保存时以表的ID

'番号为准。

'首先加入快捷菜单,命名为ctMnuForDg1,并添加两子菜单,复制(&C)和粘贴(&P),

'复制按钮

PrivateSubtsMnuCopy_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlestsMnuCopy.Click

'注意,选择数据源时,只能选择一行,但同时可选择多个单元格。

'此方法旨在将DataGridView中选择的任意多连续单元格的值复制到剪贴板中

'以便粘贴至其他地方如Excel中或其他的程序中。

DimCellValueAsString=""'定义粘贴的值

DimRCountAsInteger'当前行数

DimCCountAsInteger'当前列数

DimMaxRCountAsInteger=dg1.SelectedCells(0).RowIndex'当前最大行数

DimMaxCCountAsInteger=dg1.SelectedCells(0).ColumnIndex'当前最大列数

DimMinRCountAsInteger=dg1.SelectedCells(0).RowIndex'最小行数

DimMinCCountAsInteger=dg1.SelectedCells(0).ColumnIndex'最小列数

ForiAsInteger=1Todg1.SelectedCells.Count-1

'表中循环获得最大行数,列数和最小行数和列数

RCount=dg1.SelectedCells(i).RowIndex

IfMaxRCount

MaxRCount=RCount

EndIf

IfMinRCount>RCountThen

MinRCount=RCount

EndIf

CCount=dg1.SelectedCells(i).ColumnIndex

IfMaxCCount

MaxCCount=CCount

EndIf

IfMinCCount>CCountThen

MinCCount=CCount

EndIf

Next

'将每一单元格的值添加到变量中

ForiAsInteger=MinRCountToMaxRCount

ForjAsInteger=MinCCountToMaxCCount

Ifj

CellValue+=dg1.Rows(i).Cells(j).Value.ToString&Chr(9)

Else

CellValue+=dg1.Rows(i).Cells(j).Value.ToString

EndIf

Next

'在剪贴板中最后都要加一空白行,所以此处无需处理。

CellValue+=Chr(13)+Chr(10)'注意13在前10在后才有回车效果。

Next

'最后将获得的值输入到剪贴板中

Clipboard.SetData(DataFormats.Text,CellValue)

EndSub

'粘贴按钮

PrivateSubtsMnuPaster_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlestsMnuPaster.Click

Try

Me.Cursor=Cursors.WaitCursor

conn.Open()'打开连接

DimRowChangeCharAsString=Chr(13)+Chr(10)'换行字符

DimClmChangeCharAsString=Chr(9)'列间隔字符

DimR,CAsInteger'选择的行和列的索引

DimCellValueAsString'当前取到的值

CellValue=Clipboard.GetText().Trim'从剪贴板获得值

DimRowsCountAsInteger=CellValue.Split(RowChangeChar).Length

DimClmsCountAsInteger=CellValue.Split(RowChangeChar)(0).Split(ClmChangeChar).Length

DimSelCountAsInteger=dg1.SelectedCells.Count

'把行和列的惟一索引分别存储在数组中,然后各自排列,最后再组合在一起。

DimCIndex_ArrAsNewArrayList

DimRIndex_ArrAsNewArrayList

DimFirstColumnIndexAsInteger

DimFirstRowIndexAsInteger

DimWhereConditionAsString'作为更新条件的语句如whereID='1'

'DimPrev_RAsInteger=dgColor.SelectedCells(0).RowIndex()

'先将行列索引分别输入各自的数组中

ForiAsInteger=0ToSelCount-1

'

'取得此选择纪录的对于dg的行索引位置

R=dg1.SelectedCells(i).RowIndex

'取得此选择纪录的对于dg的列索引位置

C=dg1.SelectedCells(i).ColumnIndex

RIndex_Arr.Add(R)

CIndex_Arr.Add(C)

Next

'对索引排序

RIndex_Arr.Sort()

CIndex_Arr.Sort()

FirstColumnIndex=CIndex_Arr(0)

FirstRowIndex=RIndex_Arr(0)

DimPastStrAsString

DimRow_SAsInteger'当前源数据中的行索引

DimUpdateFieldValueAsString'写入到数据库的数据如:

字段名='b'

DimR_PrevAsInteger=RIndex_Arr(0)

ForiAsInteger=0ToRIndex_Arr.Count-1

'依次获得行的索引

R=FirstRowIndex+i

WhereCondition=dg1.Rows(R).Cells(0).Value.ToString

'依次获得列的索引

'如果i=0为首次计算,然后判断是否不等时才输入,

UpdateFieldValue=""

ForjAsInteger=0ToClmsCount-1

PastStr=CellValue.Split(RowChangeChar)(Row_S).Split(ClmChangeChar)(j).ToString

C=FirstColumnIndex+j

dg1.Rows(R).Cells(C).Value=PastStr

'2014/03/13修正,更新语句改为末尾处理掉多余的逗号的方式。

UpdateFieldValue+=dg1.Columns(C).Name&"='"&PastStr&"',"

Next

'处理掉多余的逗号。

UpdateFieldValue=UpdateFieldValue.Substring(0,UpdateFieldValue.Length-1)

'该部分语句可迁徙到其他类中,由于是demo所以放在此处。

sql="Updatenametableset"&UpdateFieldValue&"whereID='"&WhereCondition&"'"

cmd=NewSqlCommand

cmd.Connection=conn

cmd.CommandType=CommandType.Text

cmd.CommandText=sql

cmd.ExecuteNonQuery()'此处直接将数据保存到底层数据库中。

'当前行位置,每次累加到末尾,再从头开始。

'即被粘贴的行数超过剪贴板的行数时,再寻坏从0开始,直到选中粘贴的末行为止。

IfRow_S=RowsCount-1Then

Row_S=0

Else

Row_S+=1

EndIf

Next

CatchexAsException

MsgBox(ex.Message)

Finally

Me.Cursor=Cursors.Default

conn.Close()

EndTry

EndSub

#EndRegion

以上

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1