2017-03-18 33 views
0

我已經寫了下面的代碼把唯一入選的DataGridView行到剪貼板中的文本。順序是選定行的複製粘貼得到改變在vb.net

`

  Dim ClipBoardBuilder As New StringBuilder() 

      For Each row As DataGridViewRow In MyRows 
       For Each Column As DataGridViewColumn In dgv1.Columns 
        If Column.Visible = True Then ClipBoardBuilder.Append(row.Cells(Column.DisplayIndex).FormattedValue.ToString() + vbTab) 
       Next 
       ClipBoardBuilder.AppendLine() 
      Next 

      If dgv1.GetClipboardContent() IsNot Nothing Then Clipboard.SetText(ClipBoardBuilder.ToString()) 


      Dim ClipBoardText as string = Clipboard.GetText() 

`

但同時網格粘貼選定行的順序得到改變。 例如 row1 - A1 B1 C1 row2 - A2 B2 C2 row3 - A3 B3 C3 然後在剪輯板它被示出爲對面象下面和在網格中相同得到粘貼如下所示 row3 - A3 B3 C3 row2 - A2 B2 C2 row1 - A1 B1 C1 如何使順序序列作爲原始是,而在格粘貼。

在此先感謝....

回答

0

你可以排序你的gridview。

DataGridView1.Sort(DataGridView1.Columns(1), ListSortDirection.Ascending) 
+0

遺憾的錯誤理解。我在問,爲什麼在放入字符串構建器之後放入ClipBoard中,順序變得更改了? 因爲在同一個網格中粘貼相同的複製行之後,順序發生了變化。 複製順序 ' ROW1 2行 ROW3 ' 但貼順序 ' ROW3 2行 ROW1 ' 爲什麼呢? – picnic4u

+0

抱歉@ picnic4u我錯了。但我已經通過你的代碼。對我來說剪貼板的文字順序沒有變化。它對我來說顯示順序正確 – PRABA

0

在這裏,我遍歷所選的行,選定的行將以選定的順序進入。

如果用戶選擇第1行,然後第3行,然後第2行。在這種情況下,按行收集他們的選擇順序是指 第1行 第三排 第二排

所以當我在剪貼板中使用字符串生成器,那麼應​​對它得到複製爲每個選定的行會在那裏選擇的序列順序但不作爲每assending行索引順序

所以對於這個迭代之前我正在排序中,如下所示assending索引順序選定行。

Dim dgvRows As List(Of DataGridViewRow) = (From c As DataGridViewRow In dgv1.SelectedRows.Cast(Of DataGridViewRow)() Select c Order By c.Index).Cast(Of DataGridViewRow)().ToList

現在是越來越粘貼僅在需要的順序。

0

我猜有混亂,如何選擇行DataGridView s的組織。 SelectedRows返回DataGridViewSelectedRowCollection。正如你注意到的,這個集合的順序是這樣的,LAST選擇的行在集合中的索引爲零(0)處,並且第一個選擇的行在集合的LAST索引處。

如果你想獲得用戶選擇的行原來的順序,你可以扭轉的集合,或者你可以簡單地遍歷集合從最後一個索引到第一起。這將獲得用戶選擇行的原始順序。

記住

熊,你不能假設用戶將在一個自上而下的方式選擇行。用戶可以選擇第2行,然後是第9行,然後是第4行,然後是第3行。根據您的操作,這可能是可以接受的,但是如果您要刪除選定的行,則需要對集合進行排序,行按連續順序排列。由於不清楚你使用這些選定的行做什麼,我會假設刪除行不是你正在做的事情。

下面是如何獲得所選行的原始順序一個簡單的例子。注:DataGridViewSelectionMode應設置爲FullRowSelect。希望這可以清理一些事情。

enter image description here

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    FillGrid() 
End Sub 

Private Sub FillGrid() 
    For i = 1 To 15 
    DataGridView1.Rows.Add("Row" + i.ToString() + "C1", "Row" + i.ToString() + "C2", "Row" + i.ToString() + "C3") 
    Next 
End Sub 

Private Sub btSelectedRows_Click(sender As Object, e As EventArgs) Handles btSelectedRows.Click 
    TextBox1.Text += "Reverse selected values --------" + Environment.NewLine 
    TextBox1.Text += "There are " + DataGridView1.SelectedRows.Count.ToString() + " selected Rows" + Environment.NewLine 
    For Each curSelectedRow As DataGridViewRow In DataGridView1.SelectedRows 
    If Not curSelectedRow.IsNewRow Then ' ignore new row if selected 
     TextBox1.Text += curSelectedRow.Cells(0).Value + ", " + curSelectedRow.Cells(1).Value + ", " + curSelectedRow.Cells(2).Value + Environment.NewLine 
    End If 
    Next 
    TextBox1.Text += "End of Reverse selected values --------" + Environment.NewLine 
End Sub 

Private Sub btOriginalSelection_Click(sender As Object, e As EventArgs) Handles btOriginalSelection.Click 
    TextBox1.Text += "Original order of selected values --------" + Environment.NewLine 
    TextBox1.Text += "There are " + DataGridView1.SelectedRows.Count.ToString() + " selected Rows" + Environment.NewLine 
    Dim selectedRows As DataGridViewSelectedRowCollection = DataGridView1.SelectedRows 
    For rowIndex = selectedRows.Count - 1 To 0 Step -1 
    If Not selectedRows(rowIndex).IsNewRow Then ' ignore new row if selected 
     TextBox1.Text += selectedRows(rowIndex).Cells(0).Value + ", " + selectedRows(rowIndex).Cells(1).Value + ", " + 
         selectedRows(rowIndex).Cells(2).Value + Environment.NewLine 
    End If 
    Next 
    TextBox1.Text += "End of Original selection order of selected values --------" 
End Sub 

末級