2010-12-06 3 views
1

나는 DataColumns 세 가지가 들어있는 언 바운드 데이터가있는 DataGridView이 있습니다. 행은 각 열별로 정렬 될 수 있지만 표시된 데이터를 조작 할 수는 없습니다.현재 표시된 순서로 선택된 DataGridViewRows 가져 오기

SelectedRows 속성을 쿼리 할 때 처음 삽입 된 순서대로 행이 정렬되며 현재 표시된 순서 나 선택한 순서로 예상 한 것과 다릅니다. 이 동작을 변경하는 방법이 있습니까?

답변

2

나는이 할 수있는 한 줄 방법이 생각하지 않습니다. 정렬을 사용자 고유의 목록으로 다시 실행 한 다음 SelectedItems와 함께 IndexOf를 사용하여 시각적 위치를 찾으십시오.

List<DataGridViewRow> l = new List<DataGridViewRow>(); 
foreach (DataGridViewRow r in dgv.Rows) 
{ 
    l.Add(r); 
} 

l.Sort((x, y) => 
    { 
     IComparable yComparable = (IComparable)x.Cells[dgv.SortedColumn.Index].Value; 
     IComparable yc = (IComparable)x.Cells[dgv.SortedColumn.Index].Value; 

     if (dgv.SortOrder == SortOrder.Ascending) 
      return yc.CompareTo(yComparable); 
     else 
      return yComparable.CompareTo(yc); 
    } 
    ); 

foreach(DataGridViewRow r in dgv.SelectedRows) 
{ 
    int selectedIndex = l.IndexOf(r); 
} 

위의 사항은 컴파일 테스트를 거치지 않았으므로 약간의 조정이 필요할 수 있습니다.

+1

생성 된 목록을 역으로 사용하면 작동합니다. – xsl

+0

그런 식으로 뭔가 있을지도 모른다고 생각합니다. 반환을 전환했습니다 ... CompareTo 라인. 알려 줘서 고마워. –

0

이 같은 선택된 셀의 값을 참조 할 수 있어야한다 :

Private Sub determinePKVals(ByRef PKVal As String, ByRef PKVal2 As String, Optional ByVal row As Integer = -1) 
    If row = -1 Then  ' optional value not passed 
     row = dgvDisplaySet.CurrentRow.Index 
    End If 

    PKVal = dgvDisplaySet.Rows(row).Cells(0).Value 
    PKVal2 = dgvDisplaySet.Rows(row).Cells(1).Value 
End Sub 
3

SelectedRows 속성에는 선택한 행이 있지만 역순으로 표시되며 가장 최근 항목은 목록의 시작 부분에 있습니다. 올바른 사용자 선택 순서를 얻으려면 다음 코드를 사용하십시오.

List<DataGridViewRow> dgList = new List<DataGridViewRow>(); 
foreach (DataGridViewRow r in dgv.SelectedRows) 
{ 
    dgList.Insert(0, r); 
} 
foreach(DataGridViewRow r in dgList) 
{ 
    //Print/consume your row here. 
    int selectedIndex = r.Index; 
} 

참고 : 정렬 할 필요가 없습니다.

4

동일한 문제가 있습니다.

List<DataGridViewRow> rows = 
    (from DataGridViewRow row in dgv.SelectedRows 
    where !row.IsNewRow 
    orderby row.Index 
    select row).ToList<DataGridViewRow>(); 
+0

예 선택한 행을 정렬하려면 가장 짧고 가장 좋은 방법입니다. + 1. 감사합니다. – SajuPK

0

여기에 위의 코드의 vb.net 버전입니다 : 그것의 가장 짧은 길을 찾습니다.

C#을

List<DataGridViewRow> rows = 
    (from DataGridViewRow row in dgv.SelectedRows 
    where !row.IsNewRow 
    orderby row.Index 
    select row).ToList<DataGridViewRow>(); 

VB.NET은

Dim rows As List(Of DataGridViewRow) = (From row As DataGridViewRow 
    In dgv.SelectedRows Where Not row.IsNewRow Order By row.Index).ToList() 

VB.NET 변환기에 C#을 올바르게 번역하지 않습니다.

희망이 VB.NET 코더가 사용하고자하는 희망이.

관련 문제