2010-10-07 18 views
7

Na liście krajów, które muszą być wyświetlane w kolejności alfabetycznej, należy umieścić Stany Zjednoczone u góry listy. Jak to zrobisz?Jak zachować określony kraj na liście rozwijanej?

Odpowiedziałem, że będę miał strukturę tabeli w taki sposób, że USA jest na id-0. Pozostałe kraje są wymienione w kolejności alfabetycznej.

Więc kiedy pobrać ze stołu, będę zrobić „SELECT CountryName from tableOfCountries ORDER by ID

Nie jestem pewien, czy ankieter chciał tego słuchać. Więc zasugerowałem inną opcję zapełnienia tablicy krajów z USA jako pierwszy element. Następnie reszta elementów zostanie wypełniona z zestawu wyników zapytania.

"SELECT CountryName FROM tableOfCountries WHERE countryName != 'US' ORDER by COUNTRY_NAME". 

To zapewni, że USA nie zostaną wybrane dwukrotnie.

Ankieter również nie był zadowolony z tej opcji. Więc zapytał mnie, czy mam jakąś inną opcję. Następnie powiedziałem plik tekstowy na serwerze internetowym z listą wartości.

Czy masz jakieś inne opcje, które możesz wymyślić?

+5

Powiedz im, aby nie być tak Zorientowany na Amerykę ;-) –

+0

Jest trochę tak irytujących jak lista alfabetyczna z niektórymi wpisami usuniętymi z listy i umieszczonymi na górze. Użytkownik może tracić sporo czasu szukając w środku swojego kraju. Jeśli chcesz mieć listę u góry, zrób listę ** duplikatów **, a nie listę ** przeniesionych ** wpisów. – Quentin

+0

@ David, Ta odpowiedź prawdopodobnie zirytowałaby rozmówcę. – abhi

Odpowiedz

8

Generalnie coś takiego:

SELECT 
    CountryName 

from tableOfCountries 

ORDER by 
    (case when CountryName = 'US' then 0 
    else 1 end) asc, CountryName asc 
+0

Nie opierałbym instrukcji case na CountryName. Co jeśli później chcesz zmienić nazwę na "Stany Zjednoczone". Czy możesz pamiętać, aby go zmienić w instrukcji sprawy? – kevev22

+1

@ kevev22: Następnie oprzyj go na kluczu podstawowym lub załóż, że nazwa się nie zmieni. Tak, to jest bardziej kruche niż modyfikowanie rzeczywistej tabeli do przechowywania wartości, ale to podejście nie wymaga zmiany w strukturze tabeli (co może, ale nie musi być problemem). –

+1

@ kevev22: Dodatkowo, podejście to daje ci także elastyczność do posiadania różnych "domyślnych" wartości w różnych okolicznościach (powiedzmy, domyślnie jest to kraj macierzysty użytkownika zamiast USA). Wydaje się to prawdopodobne, podobnie jak w przypadku globalnego kraju lub krajów domyślnych. –

3

Może:

select name from countries 
order by case when name = 'US' then 1 else 2 end, name; 
10

mieć inny int kolumna w tabeli kraju nazywany pierwszeństwo.

Przypisz Stany Zjednoczone A pierwszeństwo większy niż 1 i zostawić wszystkie inne kraje na 0.

programu SQL będzie wtedy wyglądać tak:

select Name from countries 
order by precedence desc, name asc 

Pozwoli to skala tego później, jeśli zajdzie taka potrzeba.

+0

Jaka byłaby korzyść z dodania pola zamiast teraz, jeśli jest to potrzebne później (co wydaje się mało prawdopodobne)? –

+2

@Adam: dlaczego uważasz, że jest to mało prawdopodobne? Jeśli baza klientów PO rozszerzy się, aby inne kraje również były głównymi klientami, wówczas można by również umieścić te kraje na szczycie listy. na przykład Często widzę drop-downy z kilkoma krajami na szczycie, np. Stany Zjednoczone, Kanada, Wielka Brytania, Francja, Niemcy, a dopiero potem wszystkie pozostałe kraje są uporządkowane alfabetycznie. – Ether

+0

@Ether: Myślę, że jest to mało prawdopodobne, aby w krótkim czasie zostać rozważone. Jeśli nie ma korzyści z dodania kolumny teraz, a później, to dodanie jej zanim będzie ona potrzebna, jest nadprogramowe (jakkolwiek może być niewielkie). –

3

Z pewnością nie nadużywałbym tego w ten sposób, gdybym mógł tego uniknąć.

Jeden mógłby dać priorytetów krajów i wówczas:

select isoCode, name from countries order by priority desc, name 

Alternatywnie, dlaczego mają to na górze? Sugerowałbym zmianę logiki tak, aby pozostały w kolejności alfabetycznej, ale US był domyślnym wyborem do czasu zmiany.

-1

Jeśli jest to w języku C#, lekceważąc sposób w jaki dane wracają z serwera, umieszczając je w określonym typie i implementując IComparable na danym typie. Menu rozwijane następnie je odpowiednio zatrzyma, ponieważ możesz określić w metodzie CompareTo, że typ US jest "większy" w innych krajach.

class Country : IComparable<Country> 
{ 
    int IComparable<Country>.CompareTo(Country other) 
    { 
     <US logic> 
     else 
      return String.Compare(this.CountryName, other.CountryName); 
    } 
} 

EDIT: Właściwie to jest w C# na podstawie tagów PO za. Dlaczego skupienie się na zapleczu do prezentacji ma miejsce poza mną.

+0

Błąd, nie. Nie ma żadnych formantów danych, które automatycznie sortują elementy w źródle danych na podstawie wyniku porównania. –

+0

@Adam Nigdzie nie ma żadnego wzmianki o tym, że muszą one być databound. W tym przypadku umieszczenie obiektów w sortowalnym pojemniku będzie następnie korzystać z implementacji IComparable i robić, co będzie potrzebne po wywołaniu funkcji Sort(). Cokolwiek zrobiono z tym zbiorem po fakcie, nie ma znaczenia; na przykład powiązanie go z ComboBox. Nie inaczej jest, gdy robimy to na zapleczu i przesuwanie tego zbioru w górę do interfejsu użytkownika, który ma być wyświetlany w danej kontrolce. Jeśli mówimy o konkretnych technologiach .NET, to możesz również skorzystać z CollectionView. –

1

Innym sposobem na zrobienie tego byłoby uzyskanie listy stanów, a następnie przefiltrowanie ich do widoku danych, z wyłączeniem elementów domyślnych. Następnie ustaw właściwość control listy AppendDataBoundItems na wartość true. Dodaj swoje elementy do kontrolki listy, a następnie wpisz dane do widoku danych.

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.listcontrol.appenddatabounditems.aspx

To będzie miało wpływ nie wyczyszczenie wartości domyślne, gdy wystąpi DataBind.

Powiązane problemy