• 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

Làm việc với Datagridview

Các thủ thuật liên quan đến ứng dụng, biểu mẫu và control

Moderators: tungcan5diop, QUANITGROBEST

User avatar
vo_minhdat2007
Quản trị
Quản trị
Posts: 2227
Joined: Sun 17/07/2005 1:40 am
Has thanked: 13 times
Been thanked: 87 times
Contact:

Làm việc với Datagridview

Postby vo_minhdat2007 » Sun 22/03/2009 4:15 pm

Thủ thuật: Thao tác Clipboard với các ô đã chọn trong Datagridview (DG)
Tác giả: vo_minhdat2007
Mô tả: Copy - Paste trong Datagridview với các ô đã do người dùng chọn, thành công 100%


Không nói Cut, vì Cut thực chất là Copy rồi sau đó các ô nào đang chọn cho Value = "" là xong!
Copy :
Trước tiên phải set thuộc tính ClipboardCopyMode là EnableWithoutHeaderText.
Trong sự kiện nút Copy chẳng hạn (hoặc sự kiện KeyDown Ctrl + C của DG) :

Code: Select all

  1. If Me.DataGridView1.GetCellCount(DataGridViewElementStates.Selected) > 0 Then _
  2.             Clipboard.SetDataObject(Me.DataGridView1.GetClipboardContent())

Paste :

Code: Select all

  1. Dim s As String = Clipboard.GetText()
  2.         Dim lines As String() = s.Split(ControlChars.Lf)
  3.         Dim row As Integer = DataGridView1.CurrentCell.RowIndex
  4.         Dim col As Integer = DataGridView1.CurrentCell.ColumnIndex
  5.         For Each line As String In lines
  6.             If row < DataGridView1.RowCount AndAlso line.Length > 0 Then
  7.                 Dim cells As String() = line.Split(ControlChars.Tab)
  8.                 For i As Integer = 0 To cells.GetLength(0) - 1
  9.                     If col + i < Me.DataGridView1.ColumnCount Then
  10.                         DataGridView1(col + i, row).Value = Convert.ChangeType(cells(i), DataGridView1(col + i, row).ValueType)
  11.                     Else
  12.                         Exit For
  13.                     End If
  14.                 Next
  15.                 row += 1
  16.             Else
  17.                 Exit For
  18.             End If
  19.         Next



User avatar
vo_minhdat2007
Quản trị
Quản trị
Posts: 2227
Joined: Sun 17/07/2005 1:40 am
Has thanked: 13 times
Been thanked: 87 times
Contact:

Re: Thao tác Clipboard với các ô đã chọn trong Datagridview

Postby vo_minhdat2007 » Sun 22/03/2009 4:17 pm

Code C# :
Copy :

Code: Select all

  1. DataObject d = dataGridView1.GetClipboardContent();
  2. Clipboard.SetDataObject(d);

Paste :

Code: Select all

  1.                string s = Clipboard.GetText();
  2.                 string[] lines = s.Split('\n');
  3.                 int row = dataGridView1.CurrentCell.RowIndex;
  4.                 int col = dataGridView1.CurrentCell.ColumnIndex;
  5.                 foreach (string line in lines)
  6.                 {
  7.                     if (row < dataGridView1.RowCount && line.Length >
  8. 0)
  9.                     {
  10.                         string[] cells = line.Split('\t');
  11.                         for (int i = 0; i < cells.GetLength(0); ++i)
  12.                         {
  13.                             if (col + i <
  14. this.dataGridView1.ColumnCount)
  15.                             {
  16.                                 dataGridView1[col + i, row].Value =
  17. Convert.ChangeType(cells[i], dataGridView1[col + i, row].ValueType);
  18.                             }
  19.                             else
  20.                             {
  21.                                 break;
  22.                             }
  23.                         }
  24.                         row++;
  25.                     }
  26.                     else
  27.                     {
  28.                         break;
  29.                     }
  30.                 }

thuyan1990
Thành viên trung thành
Thành viên trung thành
Posts: 299
Joined: Sat 02/01/2010 10:23 am
Has thanked: 20 times
Been thanked: 2 times

Re: Làm việc với Datagridview

Postby thuyan1990 » Sun 24/01/2010 11:18 am

Bạn có thể cho mình xin 1 cái ví dụ với sao mình làm nó không hoạt động thanks

User avatar
fugio
Thành viên năng nổ
Thành viên năng nổ
Posts: 83
Joined: Thu 26/02/2009 1:58 pm
Location: ha noi
Has thanked: 8 times
Been thanked: 7 times
Contact:

Re: Làm việc với Datagridview

Postby fugio » Sat 27/07/2013 8:20 pm

Em đang thực hiện một hình thức khác, và nó không định dạng được chữ có dấu. Anh xem giúp em được không ạ ? xin cảm ơn !

Code: Select all

  Sub cutdgv()
        copydgv()
        For Each cell As DataGridViewCell In DataGridView1.SelectedCells
            cell.Value = String.Empty
        Next
    End Sub
    Sub copydgv()
        Dim dtObj As DataObject = DataGridView1.GetClipboardContent()
        If dtObj IsNot Nothing Then
            Clipboard.SetDataObject(dtObj)
        End If
    End Sub
   
    Public Shared Sub OnDataGridViewPaste(ByVal dgv As Object, ByVal e As KeyEventArgs)
        PasteToClipboard(dgv)
    End Sub
    Public Shared Sub PasteToClipboard(ByVal dgv As DataGridView)
        Dim rowSplitter As Char() = {vbCr, vbLf}
        Dim columnSplitter As Char() = {vbTab}
        Dim dataInClipboard = Clipboard.GetDataObject()
        Dim strInClipboard As String = dataInClipboard.GetData(DataFormats.Text)

        Dim rowInClipboard As String() = strInClipboard.Split(rowSplitter, StringSplitOptions.RemoveEmptyEntries)

        Dim row As Integer = dgv.SelectedCells(0).RowIndex
        Dim col As Integer = dgv.SelectedCells(0).ColumnIndex

        If dgv.Rows.Count < (row - rowInClipboard.Length) Then
            dgv.Rows.Add(row - rowInClipboard.Length - dgv.Rows.Count)
        End If
        For irow As Integer = 0 To rowInClipboard.Length - 1
            Dim valueInRow As String() = rowInClipboard(irow).Split(columnSplitter)
            For icol As Integer = 0 To valueInRow.Length - 1

                If dgv.ColumnCount - 1 >= col + icol Then
                    Dim cell As DataGridViewCell = dgv.Rows(row + irow).Cells(col + icol)
                    If Not cell.ReadOnly Then

                        cell.Value = valueInRow(icol)
                    End If
                End If

            Next
        Next

    End Sub
    Private Sub DataGridView1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles DataGridView1.KeyDown
        Try
            Dim dgv As New DataGridView()
            If e.Modifiers = Keys.Control Then
                Select Case e.KeyCode
                    Case Keys.X
                        cutdgv()
                    Case Keys.C
                        copydgv()
                    Case Keys.V
                        OnDataGridViewPaste(sender, e)
                End Select
            End If
        Catch ex As Exception

        End Try
    End Sub

User avatar
fugio
Thành viên năng nổ
Thành viên năng nổ
Posts: 83
Joined: Thu 26/02/2009 1:58 pm
Location: ha noi
Has thanked: 8 times
Been thanked: 7 times
Contact:

Re: Làm việc với Datagridview

Postby fugio » Sat 27/07/2013 9:18 pm

Nếu như select cả dòng hoặc ít hơn rồi paste vào cuối ô của dòng đã select hoặc copy ngượi lại thì các giá trị đều bị đẩy về cuối và bỏ trống các ô đầu.
có cách nào khắc phục tình trạng này không ạ ?
Em đã khắc phục được chúng nhưng nó đều bị đảo dòng hoặc cột. cũng không biết phải làm thế nào ?


Return to “[.NET] Ứng dụng - Form và Control”

Who is online

Users browsing this forum: No registered users and 0 guests