DataGridView的增删改

  • 格式:doc
  • 大小:156.50 KB
  • 文档页数:6

1 DataGridView中直接增删改查的方法

在 或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 具体代码如下:

Imports System.data

Imports System.data.sqlclient

Public Class frmDataGridViewPast

#Region "定义变量"

Private conn As New SqlConnection("server=server;database=dbtest;uid=sa;pwd=sa")

Private da As New SqlDataAdapter()

Private tbl As New DataTable

Private sql As String = ""

Private cmd As New SqlCommand

#End Region

#Region "初始加载"

Private Sub InitLoad()

'初始加载程序

Try

Me.Cursor = Cursors.WaitCursor

'打开连接

conn.Open()

sql = "select ID,Number,[Name],age,gender,Address,Telphone,Email from nametable"

cmd.Connection = conn

mandText = sql

mandType = CommandType.Text

da.SelectCommand = cmd

tbl.Clear()

tbl = New DataTable

da.Fill(tbl)

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

Dim bindSrc As New BindingSource

bindSrc.DataSource = tbl

Me.dg1.DataSource = bindSrc

bdnv1.BindingSource = bindSrc

'将DataGridView的列宽设定为所有单元格,每列的宽度以该列中最宽单元格宽度为准显示 3 '该方法不会关闭手动调整列宽的功能.

dg1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells)

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

dg1.Columns(0).ReadOnly = True

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

Catch ex As Exception

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

MsgBox(ex.Message)

Finally

Me.Cursor = Cursors.Default

conn.Close()

End Try

End Sub

Private Sub frmDataGridViewPast_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles

MyBase.Load

InitLoad()

End Sub

#End Region

#Region "添加新数据"

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

Private Sub tsBtnAddNew_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles

tsBtnAddNew.Click

Try

Me.Cursor = Cursors.WaitCursor

conn.Open()

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

cmd = New SqlCommand

cmd.Connection = conn

mandType = CommandType.Text

mandText = sql

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

Catch ex As Exception

MsgBox(ex.Message)

Finally 4 Me.Cursor = Cursors.Default

conn.Close()

End Try

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

InitLoad()

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

dg1.FirstDisplayedScrollingRowIndex = dg1.RowCount - 1

End Sub

#End Region

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

Private Function getDeleteID() As Integer()

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

Dim ID() As Integer

ReDim ID(dg1.SelectedRows.Count)

For i As Integer = 0 To dg1.SelectedRows.Count - 1

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

Next

Return ID

End Function

Private Sub DeleteData()

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

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

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

Try

Me.Cursor = Cursors.WaitCursor

conn.Open()

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

Dim ID() As Integer = getDeleteID()

For i As Integer = 0 To ID.Length - 1

sql = "delete from nameTable where ID='" & ID(i) & "'"

cmd = New SqlCommand

cmd.Connection = conn

mandType = CommandType.Text

mandText = sql

cmd.ExecuteNonQuery()

Next

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

Dim x As Integer = dg1.SelectedRows.Count

While x > 0

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