Lista över världens länder med .NET

Eftersom lokaliserings-funktionerna i ASP.NET är baserade på kulturer (MSDN:CultureInfo) kan det vara lite knepigt att generera en lista över alla världens länder.

Om man även vill ha dem i bokstavsordning får man se till att sortera dem själv. Jag la till alla länderna som nycklar i en SortedList, eftersom denna typ av datasamling automatiskt sorteras efter värdet i nycklarna.

Jag visar länderna och deras landskoder i en DropDownList som läggs till på .aspx-sidan.

<asp:DropDownList id="ddlCountry" DataValueField="CountryCode" DataTextField="CountryName" style="width:200px;" runat="server" />

I kodfilens Page_Load-event binder jag denna DropDown till en DataView.

void Page_Load(object Source, EventArgs E)
{
if((!Page.IsPostBack)
{
ddlCountry.DataSource = GetAllCountriesDataView();
ddlCountry.DataBind();
}
}

Funktionen för att skapa datakällan ser ut så här:

protected DataView GetAllCountriesDataView()
{
DataTable objTable = new DataTable("Countries");
objTable.Columns.Add("CountryName", typeof(string));
objTable.Columns.Add("CountryCode", typeof(string));

DataRow objDataRowTitle = objTable.NewRow();
objDataRowTitle["CountryCode"] = 0;
objDataRowTitle["CountryName"] = "Välj land";
objTable.Rows.InsertAt(objDataRowTitle, 0);

//Skapa en SortedList för att spara alla länderna med tillhörande landskoder
SortedList slAddedCountries = new SortedList();

//Skapa en array av CultureInfo från alla kulturer
//Vi använder SpecificCultures men NeutralCultures är ett annat alternativ
CultureInfo[] arrayAllCultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures);

try
{
foreach (CultureInfo ci in arrayAllCultures)
{

string country = new RegionInfo(ci.LCID).EnglishName;
string countryCode = ci.Name.Substring(3, 2);

if (!slAddedCountries.ContainsKey(country))
{
//Spara landets namn som nyckel och landskoden som värde
slAddedCountries.Add(country, countryCode);
}
}

//Lägg till länder som saknas
//Cypern
slAddedCountries.Add("Cyprus", "CY");

//Loopa igenom SortedList och vi får länderna i bokstavsordning
foreach (DictionaryEntry de in slAddedCountries)
{
Trace.Write("-"+de.Key);
DataRow objDataRow = objTable.NewRow();
objDataRow["CountryCode"] = de.Value;
objDataRow["CountryName"] = de.Key;
objTable.Rows.Add(objDataRow);
}
}
catch (Exception objException)
{
Trace.Warn("BindCultureSelector() Fel!", objException.Message);
}
finally
{

}

return objTable.DefaultView;
}

Här kommer ett del av den html-kod som skapas med de länder som ligger runt Sverige (i bokstavsordning alltså).

<option value="ZA">South Africa</option>
<option value="ES">Spain</option>
<option value="SE">Sweden</option>
<option value="CH">Switzerland</option>
<option value="-S">Syria</option>
<option value="TW">Taiwan</option>
<option value="TH">Thailand</option>
<option value="TT">Trinidad and Tobago</option>

Inte helt självklart alltså. Det går säkert att göra på något bättre sätt men detta är den bästa lösning jag kommit på. Annars kan man ju prova med en fristående databas över länder, t ex från GeoNames.

Uppdatering: Märkte att Cypern inte är med i ramverket av någon anledning. Konstigt eftersom landet blev självständigt 1960. Jag har lagt till en extra rad i koden som lägger till Cypern manuellt.

Comments

[…] Typiskt. Precis när man kämpat med att få ut en lista över länder i alfabetisk ordning så är det nån annan som gör precis samma sak. […]
Tjena, kollade på denna och denna artikel och den var mycket hjälpfull. Men lyckades dra ner på koden rätt mycket. Sen om det är bättre får väl kanske diskuteras :) Men det jag skulle göra va då att fylla en dropdownlist
Oj, självklart va jag dum o inte testade innan Skickar upp den riktiga iallafall: SortedList slCountries = new SortedList(); foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.AllCultures & ~CultureTypes.NeutralCultures)) { string countryname = new RegionInfo(ci.LCID).EnglishName; if (!slCountries.ContainsKey(countryname)) { slCountries.Add(countryname, ci.Name); } } ddlCountry.DataSource = slCountries; ddlCountry.DataTextField = "Key"; ddlCountry.DataValueField = "Value"; ddlCountry.DataBind();
Roligt att exemplet kunde vara till nytta. Tack för att du delade med dig av ditt exempel. Ser riktigt bra ut. Du lyckades verkligen optimera koden snyggt, genom att gå omvägen via en DataTable som jag gjorde. PS. Jag tog bort koden ur din första kommentar eftersom den var felaktig.