2009-09-09 13 views
8

Jaka jest właściwa metoda powiadomienia obiektu DataGridView o zaprzestaniu sortowania?.NET/WinForms - Wyczyść sortowanie na DataGridView

Mam "ekran", w którym informuję systemowo sortowanie według kolumny 4 i rosnącej. Po przejściu do innego obszaru chcę, aby ta sama siatka pojawiła się w 'default'/no sort. Usuwam wszystkie kolumny i dodaje nowe. Sortowanie pozostaje w czwartej kolumnie.

Nie widzę sposobu, aby to zrobić za pomocą metody Sort(). Jakieś pomysły?

+0

Czy to jest siatka związana z danymi? –

+0

Tak. Ale nawet przełączam DataSources. Nazywam DataSource = null i Columns.Clear przed przełącznikiem. – BuddyJoe

+0

Chciałbym umożliwić odświeżenie, ale zapisać kolejność sortowania. Ale jeśli użytkownik przełącza to, na co chce spojrzeć (za pomocą TreeView), to chciałbym, aby kolejność sortowania zniknęła. Czy to błąd? Próbowałem kilku rzeczy, nie potrafię wymyślić sposobu, żeby to odejść. – BuddyJoe

Odpowiedz

1

Nie jest to bezpośrednia odpowiedź, ale nie ma oczywiście dobrej definicji "nieposortowanej". Nie możesz posortować na (ukrytej) kolumnie, takiej jak identyfikator?

+0

dobry pomysł. Mam fałszywą kolumnę, którą dodaję do DataTable po tym, jak DataAdapter ładuje ją nazwaną "numer_wiersza", wszystko, co jest używane to paginacja (jeśli zdecyduję się ją włączyć). +1. To może być moja odpowiedź. – BuddyJoe

+1

Istnieją ograniczenia dotyczące sortowania na "fałszywych" kolumnach w połączeniu ze źródłem danych, patrz MSDN. –

6

Od MSN Forums:

DataGridView jest związany z DataView, a nie tabeli bezpośrednio, więc trzeba ustawić:

DataTable.DefaultView.Sort = String.Empty

Skutecznie wyczyszczenie sortowania na stole, a tym samym siatkę to się wiąże. Wygląda na to, że wymaga odświeżenia DataGridView, chyba że używasz 2005, a następnie możesz użyć oddzielnego menedżera powiązań.

6

Mam dostęp do sortowania na BindingSource bezpośrednio:

((BindingSource)_dgv.DataSource).Sort = string.Empty;

+0

To nie działa, jeśli DataSource jest DataTable –

+0

Dzięki! Po prostu użyłem BindingSource.Sort = "" i działało dobrze. – CrazyPaste

-1
/// C# 
/// Author : Jeudi Prando 

foreach (DataGridViewColumn column in this.DataGridView1.Columns) 
{ 
    column.SortMode = DataGridViewColumnSortMode.NotSortable; 
    column.SortMode = DataGridViewColumnSortMode.Automatic; 
} 
0

spróbuj ustawić ItemSource dla siatki do zera, a następnie ustawić go z powrotem do stołu defaultview

1

w ta sama domena co odpowiedź użytkownika user2268720 .. nie jest to najczystsze rozwiązanie, ale wykonała to zadanie z niezwiązanym DGV:

  if (dgv.SortedColumn != null) { 
       DataGridViewColumn col = dgv.SortedColumn; 
       col.SortMode = DataGridViewColumnSortMode.NotSortable; 
       col.SortMode = DataGridViewColumnSortMode.Automatic; 
      } 
0

Dzisiaj miałem ten problem. Mam numer DataGridView, który regularnie zamienia jego DataSource (a DataTable). Udało mi się w końcu usunąć rodzaju, że użytkownik określony, gdy użytkownik kliknął nagłówek kolumny stosując następujący kod:

If dgv.SortedColumn IsNot Nothing AndAlso dgv.DataSource IsNot Nothing Then 
     Dim dt_Sender As DataTable = DirectCast(dgv.DataSource, DataTable) 
     dt_Sender.DefaultView.Sort = dt_Sender.Columns(0).ColumnName & " ASC" 
    End If 

Funkcjonuje to bo mam ukrytą kolumnę w moim DataGridView który jest zawsze w pozycji kolumny indeksu 0. Jest to klucz podstawowy będący liczbą całkowitą dla podstawowych danych, które są sortowane według obciążenia danych.

* Być może będziesz musiał nazwać swoją kolumnę indeksową w DataTable, jeśli jeszcze jej nie masz (np. dt_Sender.Columns(0).ColumnName = "colIndex").

* Jeśli używasz BindingSource obiekt jako pośrednik między Twoim DataGridView i swojej DataTable (jak wielu ludzi wydaje się zrobić), a następnie trzeba będzie gniazdo swoje DirectCast odpowiednio w drugiej linii (tj Dim dt_Sender As DataTable = DirectCast(dgv.DataSource, DataTable) zmieniłoby się coś w stylu: Dim dt_Sender As DataTable = DirectCast(DirectCast(dgv.DataSource, BindingSource), DataTable)).

* Dodatkowo, jeśli twoja DataTable zapełni się zapytaniem SQL Server, które nie ma klucza głównego integer (być może identyfikatora GUID?), Możesz zmienić jego zapytanie źródłowe o nowy numer wiersza, a następnie ukryj nową kolumnę w swoim DataGridView. Na przykład.:

SELECT Row_Number() OVER (ORDER BY (SELECT '')) AS RowNumber, Column1, Column2, Column3 
FROM SourceTable 

Mam nadzieję, że to rozwiązanie jest pomocne dla kogoś innego w przyszłości.

Powiązane problemy