• Vui lòng đọc nội qui diễn đàn để tránh bị xóa bài viết
  • Tìm kiếm trước khi đặt câu hỏi

VB.NET - Esc để thoát chỉnh sửa trong Datagridview

Nơi trao đổi về các vấn đề trong lập trình Windows Forms, Console dùng cú pháp ngôn ngữ Visual Basic .NET và C#

Moderators: tungblt, vuathongtin

magicdl96
Thành viên chính thức
Thành viên chính thức
Posts: 10
Joined: Wed 08/01/2020 9:44 am

VB.NET - Esc để thoát chỉnh sửa trong Datagridview

Postby magicdl96 » Sun 03/05/2020 12:31 pm

Em chào mọi người,
Em có 1 DataGridView khi mở lên thì đã có dữ liệu sẵn.
1. Em muốn khi thay đổi dữ liệu trong 1 ô bất kỳ thì sẽ kiểm tra dữ liệu đó đã tồn tại chưa. Nếu đã tồn tại rồi thì thông báo và không thoát chỉnh sửa. (Em đã hoàn thành)
2. Nhưng em bắt sự kiện CurrentCellDirtyStateChanged thì khi em sử dụng phím Esc để hủy bỏ, nó sẽ lưu dữ liệu mới thay đổi luôn dù đã tồn tại (không trở lại dữ liệu cũ). Mà nếu xóa sự kiện CurrentCellDirtyStateChanged thì sự kiện CellValidating của em không kiểm tra được giá trị đó đã tồn tại hay chưa.

Anh chị nào hỗ trợ em vấn đề này với ạ. Làm sao để vẫn kiểm tra được dữ liệu nhưng khi nhấn phím Esc để hủy bỏ thì không thay đổi dữ liệu cũ.
Em cảm ơn.
  1.  Private Sub DataGridView1_CurrentCellDirtyStateChanged(sender As Object, e As EventArgs) Handles DataGridView1.CurrentCellDirtyStateChanged
  2.         DataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit)
  3.     End Sub

[vbnet]Private Sub DataGridView1_CellValidating(sender As Object, e As DataGridViewCellValidatingEventArgs) Handles DataGridView1.CellValidating
Dim i As Integer = 0
Dim tencot As String = "NameBodies"
If DataGridView1.Rows(e.RowIndex).Cells(tencot).Value Is Nothing Then
e.Cancel = True
MessageBox.Show("Please type name.")
Else
Do While (i < DataGridView1.Rows.Count)
If (Not (DataGridView1.Rows(i).Cells(tencot).Value) Is Nothing) Then
If (i <> e.RowIndex) AndAlso (DataGridView1.Rows(e.RowIndex).Cells(tencot).Value.ToString() = DataGridView1.Rows(i).Cells(tencot).Value.ToString()) Then
e.Cancel = True
MessageBox.Show("This name exist already. please type another")
End If
End If
i = (i + 1)
Loop
End If
End Sub[/vbnet]



magicdl96
Thành viên chính thức
Thành viên chính thức
Posts: 10
Joined: Wed 08/01/2020 9:44 am

Re: VB.NET - Esc để thoát chỉnh sửa trong Datagridview

Postby magicdl96 » Mon 04/05/2020 11:19 pm

Bác nào giúp em với ạ.

User avatar
NTN
Thành viên tâm huyết
Thành viên tâm huyết
Posts: 490
Joined: Wed 05/02/2014 3:43 pm
Location: Đồng Tháp,Việt Nam
Has thanked: 20 times
Been thanked: 8 times
Contact:

Re: VB.NET - Esc để thoát chỉnh sửa trong Datagridview

Postby NTN » Sat 09/05/2020 8:16 am

Bạn tham khảo thử đoạn mã này:

Code: Select all

Class SurroundingClass
    Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keyData As Keys) As Boolean
        Dim handled As Boolean = False

        If (keyData = Keys.Enter OrElse keyData = Keys.[Return]) Then
            handled = NavigateToNextCell()
        End If

        If Not handled Then
            handled = MyBase.ProcessCmdKey(msg, keyData)
        End If

        Return handled
    End Function

    Private Function NavigateToNextCell() As Boolean
        Dim retVal As Boolean = False

        If CurrentCell IsNot Nothing Then
            Dim columnIndex As Int32 = CurrentCell.ColumnIndex
            Dim rowIndex As Int32 = CurrentCell.RowIndex
            Dim targetCell As DataGridViewCell = Nothing

            Do

                If columnIndex >= Columns.Count - 1 Then
                    columnIndex = 0
                    rowIndex = rowIndex + 1
                Else
                    columnIndex = columnIndex + 1
                End If

                If rowIndex >= RowCount Then
                    Exit Do
                Else
                    targetCell = Me(columnIndex, rowIndex)
                End If
            Loop While targetCell.Visible = False

            If targetCell IsNot Nothing Then
                CurrentCell = targetCell
            End If

            retVal = True
        End If

        Return retVal
    End Function
End Class
Contact me: trungnhan0911@yandex.com
Github: https://github.com/nhannt201

magicdl96
Thành viên chính thức
Thành viên chính thức
Posts: 10
Joined: Wed 08/01/2020 9:44 am

Re: VB.NET - Esc để thoát chỉnh sửa trong Datagridview

Postby magicdl96 » Tue 19/05/2020 9:31 pm

Em chưa rõ lắm cách dùng 2 hàm này ạ. A hướng dẫn giúp em được không ạ.

magicdl96
Thành viên chính thức
Thành viên chính thức
Posts: 10
Joined: Wed 08/01/2020 9:44 am

Re: VB.NET - Esc để thoát chỉnh sửa trong Datagridview

Postby magicdl96 » Wed 20/05/2020 1:29 pm

Em thử làm như sau nhưng không được ạ
  1. Dim list As New List(Of Object)
  2. Private Sub DataGridView1_CellEndEdit(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellEndEdit
  3.         Call restore()
  4.     End Sub
  5.  
  6.     Public Sub restore()
  7.         If Keys.Escape Then
  8.             For Each item1 As String In list
  9.                 DataGridView1.CurrentCell.Value = item1
  10.             Next
  11.         End If
  12.     End Sub
  13.    
  14.     Public Sub restore1()
  15.         list.Add(DataGridView1.CurrentCell.Value)
  16.     End Sub
  17.     Private Sub DataGridView1_CellBeginEdit(sender As Object, e As DataGridViewCellCancelEventArgs) Handles DataGridView1.CellBeginEdit
  18.         Call restore1()
  19.     End Sub

User avatar
NTN
Thành viên tâm huyết
Thành viên tâm huyết
Posts: 490
Joined: Wed 05/02/2014 3:43 pm
Location: Đồng Tháp,Việt Nam
Has thanked: 20 times
Been thanked: 8 times
Contact:

Re: VB.NET - Esc để thoát chỉnh sửa trong Datagridview

Postby NTN » Wed 20/05/2020 8:25 pm

Bạn tham khảo đoạn mã sau:
  1. Private Sub ResetDataGridView()
  2.     dataGridView1.CancelEdit()
  3.     dataGridView1.Columns.Clear()
  4.     dataGridView1.DataSource = Nothing
  5.     InitializeDataGridView()
  6. End Sub

Nguồn Tham khảo: https://docs.microsoft.com/en-us/dotnet ... etcore-3.1

Và cũng nên xem thêm: http://www.vbforums.com/showthread.php? ... ey-to-undo

Chúc bạn may mắn! Bạn hãy tìm hiểu giúp mình với. Phần Datagridview mình chưa thành thạo lắm.
Contact me: trungnhan0911@yandex.com
Github: https://github.com/nhannt201

FlyingFox
Guru
Guru
Posts: 818
Joined: Wed 20/04/2011 9:56 am
Been thanked: 325 times

Re: VB.NET - Esc để thoát chỉnh sửa trong Datagridview

Postby FlyingFox » Thu 21/05/2020 9:33 am

Nếu DataGridView DataSource là DataTable thì trong KeyPress event viết như sau:
  1. Private Sub dataGridView1_KeyPress(ByVal sender As Object, ByVal e As KeyPressEventArgs)
  2.     Dim dgv As DataGridView = TryCast(sender, DataGridView)
  3.     If Keys.Escape.ToString() = "Escape" Then
  4.         Dim columnIndex As Integer = dgv.CurrentCell.ColumnIndex
  5.         Dim rowView As DataRowView = TryCast(dgv.CurrentRow.DataBoundItem, DataRowView)
  6.         dgv.CurrentCell.Value = rowView.Row(columnIndex, DataRowVersion.Original)
  7.     End If
  8. End Sub

magicdl96
Thành viên chính thức
Thành viên chính thức
Posts: 10
Joined: Wed 08/01/2020 9:44 am

Re: VB.NET - Esc để thoát chỉnh sửa trong Datagridview

Postby magicdl96 » Thu 21/05/2020 5:24 pm

Dạ. DataGridView của em là mở lên rồi load theo đối tượng hiện có ạ. Nên không dùng cách đó được ạ. Em đang nghiên cứu việc sử dụng code của bác NTN ạ.
Anh có thời gian hỗ trợ em phần này với ạ.. Em tìm cả 2 tuần nay rồi mà vẫn chưa ra.

FlyingFox
Guru
Guru
Posts: 818
Joined: Wed 20/04/2011 9:56 am
Been thanked: 325 times

Re: VB.NET - Esc để thoát chỉnh sửa trong Datagridview

Postby FlyingFox » Sun 24/05/2020 5:18 pm

Bạn nên upload cái form đó lên để xem để hiểu và dể test hơn.


Return to “Visual Basic .NET và C# (VB.NET & C#)”

Who is online

Users browsing this forum: No registered users and 5 guests