• 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

Điều hành viên: tungcan5diop, QUANITGROBEST

Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

Làm việc với Datagridview

Gửi bàigửi bởi vo_minhdat2007 » CN 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) :

Mã: Chọn hết

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

Paste :

Mã: Chọn hết

  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



Hình đại diện của người dùng
vo_minhdat2007
Quản trị
Quản trị
Bài viết: 2227
Ngày tham gia: CN 17/07/2005 1:40 am
Has thanked: 13 time
Been thanked: 87 time
Liên hệ:

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

Gửi bàigửi bởi vo_minhdat2007 » CN 22/03/2009 4:17 pm

Code C# :
Copy :

Mã: Chọn hết

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

Paste :

Mã: Chọn hết

  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
Bài viết: 299
Ngày tham gia: T.Bảy 02/01/2010 10:23 am
Has thanked: 20 time
Been thanked: 2 time

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

Gửi bàigửi bởi thuyan1990 » CN 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

Hình đại diện của người dùng
fugio
Thành viên năng nổ
Thành viên năng nổ
Bài viết: 83
Ngày tham gia: T.Năm 26/02/2009 1:58 pm
Đến từ: ha noi
Has thanked: 8 time
Been thanked: 7 time
Liên hệ:

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

Gửi bàigửi bởi fugio » T.Bảy 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 !

Mã: Chọn hết

  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

Hình đại diện của người dùng
fugio
Thành viên năng nổ
Thành viên năng nổ
Bài viết: 83
Ngày tham gia: T.Năm 26/02/2009 1:58 pm
Đến từ: ha noi
Has thanked: 8 time
Been thanked: 7 time
Liên hệ:

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

Gửi bàigửi bởi fugio » T.Bảy 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 ?


Quay về “[.NET] Ứng dụng - Form và Control”

Đang trực tuyến

Đang xem chuyên mục này: Không có thành viên nào trực tuyến.1 khách