Funktion för att avgöra om ett land är med i EU

Här visas en funktion för att se om ett land är med i EU. Inparameter är landets ISO-landskod och den returnerar en boolean. Mer information om EU-länderna finns på Europa.eu.

private bool isMemberOfEU(string CountryCode)
{
if (CountryCode == "AT" || CountryCode == "BE" || CountryCode == "BG" || CountryCode == "BG" || CountryCode == "CY" || CountryCode == "CZ" || CountryCode == "DK" || CountryCode == "EE" || CountryCode == "FI" || CountryCode == "FR" || CountryCode == "DE" || CountryCode == "GR" || CountryCode == "HU" || CountryCode == "IE" || CountryCode == "IT" || CountryCode == "LV" || CountryCode == "LT" || CountryCode == "LU" || CountryCode == "MT" || CountryCode == "NL" || CountryCode == "PL" || CountryCode == "PT" || CountryCode == "RO" || CountryCode == "SK" || CountryCode == "SI" || CountryCode == "ES" || CountryCode == "SE" || CountryCode == "GB")
{
return true;
}
else
{
return false;
}
}

By Jesper Lind

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.

By Jesper Lind

Packet Garden - visualiserar dina surfvanor som en planet

http://www.codeodyssey.se/upload/resource/blog/packet-garden.png

Packet Garden är något så coolt som en applikation för att visualisera den nätverkstrafik som sker på din dator. Data du laddar upp blir berg och nedladdad data representeras som dalgångar. Trafiken visar även vart på jorden trafiken skickas via genom geografiskt lokalisering. Plantor växer upp och för varje protokoll som används som 'HTTP plantor' och 'peer to peer plantor'.

Jag har testkört programmet lite och det är verkligen häftigt. När ens planet är uppbyggd kan man rulla runt på den med en liten boll och utforska planeten. Programmet är dock ganska resurskrävande och mitt grafikkort klarar inte riktigt av det. Efter några minuter på planeten så hänger sig programmet ofta. Men om du har en dator med mera kraft så kan det nog fungera bättre.

Mikrodatorn: Skapa en egen planet med hjälp av dina surfvanor

By Jesper Lind

XSLT med XMLDataSource kontrollen (och GeoNames)

Höll på att testa lite med att koppla en XMLDataSource till en DropDownList och stötte på lite problem. Jag fick följande felmeddelande:

System.Web.UI.WebControls.XmlDataSourceNodeDescriptor innehåller inte någon egenskap med namnet name.

Efter lite sökning på nätet kom jag underfund med att det inte går att ange DataTextField till ett fält-värde i xml-filen. Det ska vara attribut till en tagg för att det ska fungera. Här är ett exempel på den xml fil som jag testade med som för övrigt är genererad av an tjänst på www.geonames.org och visar "first-order administrative division" Sverige. Jag ville få fram alla län men tror inte detta var helt rätt. Resten av parametrarna som man kan skicka med finns på en lista, här.

<geonames>
<totalResultsCount>85543</totalResultsCount>

<geoname>
<name>Stockholm</name>
<lat>59.3294681359869</lat>
<lng>18.0626392364502</lng>
<geonameId>2673730</geonameId>
<countryCode>SE</countryCode>
<countryName>Sweden</countryName>
<fcl>P</fcl>
<fcode>PPLC</fcode>
</geoname>

<geoname>
<name>Gothenburg</name>
<lat>57.7166667</lat>
<lng>11.9666667</lng>
<geonameId>2711537</geonameId>
<countryCode>SE</countryCode>
<countryName>Sweden</countryName>
<fcl>P</fcl>
<fcode>PPLA</fcode>
</geoname>

<geoname>
<name>Uppsala</name>
<lat>59.85</lat>
<lng>17.6333333</lng>
<geonameId>2666199</geonameId>
<countryCode>SE</countryCode>
<countryName>Sweden</countryName>
<fcl>P</fcl>
<fcode>PPLA</fcode>
</geoname>
...
</geonames>

Jag hittade lösningen som jag använder på Raj Kaimal's blogg. För att transformera xml-filen ovan så att name blir ett attribut till geoname kan man använda en XSLT-fil (TransformGeonames.xsl) som ser ut så här.

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

<xsl:template match="geonames">
<geonames>
<xsl:apply-templates select="geoname"/>
</geonames>
</xsl:template>
<xsl:template match="geoname">
<geoname>
<xsl:attribute name="name">
<xsl:value-of select="name"/>
</xsl:attribute>
</geoname>
</xsl:template>

</xsl:stylesheet>

Slutligen visar jag den koden som konsumerar web-servicen med XSLT-transformeringen.

<%@ Page Language="C#" AutoEventWireup="true" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>XmlDataSource with XSLT</title>
</head>
<body>
<form id="form1" runat="server">
<asp:dropdownlist ID="Dropdownlist1" DataSourceID="XmlDataSource1" DataTextField="name" runat="server"></asp:dropdownlist>
<asp:XmlDataSource ID="XmlDataSource1" DataFile="http://ws.geonames.org/search?q=sverige&country=SE&fclass=ADM1" TransformFile="TransformGeonames.xsl" XPath="geonames/geoname" runat="server"></asp:XmlDataSource>
</form>
</body>
</html>

By Jesper Lind
1