2009-03-10 3 views
2

Ich mag würde meine Dropdownlist mit einer einfachen XML-Datei füllen:Populate Dropdown von XmlDataSource

<?xml version="1.0" encoding="utf-8" ?> 
<Databases> 
    <Database>foo</Database> 
    <Database>bar</Database> 
    <Database>baz</Database> 
</Databases> 

Mein XPath ist

/Databases/Database 

Mein Dropdown-Liste wird als gerendert:

<select name="databaseDropDownList" id="databaseDropDownList"> 
        <option selected="selected" value="System.Web.UI.WebControls.XmlDataSourceNodeDescriptor">System.Web.UI.WebControls.XmlDataSourceNodeDescriptor</option> 
        <option value="System.Web.UI.WebControls.XmlDataSourceNodeDescriptor">System.Web.UI.WebControls.XmlDataSourceNodeDescriptor</option> 
        <option value="System.Web.UI.WebControls.XmlDataSourceNodeDescriptor">System.Web.UI.WebControls.XmlDataSourceNodeDescriptor</option> 
</select> 

Wie soll ich den Text extrahieren?

Dank

Antwort

7

ich es von der Spitze von meinem Kopf nicht erinnern kann, aber ich denke, dass ein Fehler in XmlDataSource es war, die Sie auf Werte von XML-Knoten zu binden, verhindert. Es funktioniert nur mit Attributen. Bitte korrigieren Sie mich, wenn ich damit falsch liege. Es gibt eine leichte Modifikation Sie Ihre XML-Datei vornehmen müssen:

<%@ Page Language="C#" %> 
<script runat="server"> 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!IsPostBack) 
     { 
      string xml = 
@"<?xml version=""1.0"" encoding=""utf-8"" ?> 
<Databases> 
    <Database name=""foo"" /> 
    <Database name=""bar"" /> 
    <Database name=""baz"" /> 
</Databases>"; 
      databasesSource.Data = xml; 
      databasesSource.DataBind(); 
     } 
    } 
</script> 
<!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>Untitled Page</title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:DropDownList ID="databases" runat="server" DataSourceID="databasesSource" DataValueField="name" DataTextField="name" /> 
     <asp:XmlDataSource ID="databasesSource" runat="server" XPath="/Databases/Database" /> 
    </div> 
    </form> 
</body> 
</html> 

Bitte beachte, dass ich hinzugefügt, um das Namen Attribut stattdessen den Wert des Knotens direkt zu verwenden.

Wenn Sie die Struktur Ihrer ursprünglichen XML-Datei nicht ändern können, können Sie eine XSLT-Transformation darauf anwenden, indem Sie die TransformFile-Eigenschaft verwenden, wie in dieser post beschrieben.

-1

Hier ist eine Möglichkeit, es zu tun - Sie eine Reihe von ListItems in einer LINQ-Abfrage projizieren können:

XDocument doc = XDocument.Parse(@"<Databases> 
     <Database>foo</Database> 
     <Database>bar</Database> 
     <Database>baz</Database> 
    </Databases>"); 

YourList.Items.AddRange(
    (from XElement el in doc.Descendants("Database") 
    select new ListItem(el.Value)).ToArray() 
); 
+0

thx aber ich möchte "DropDownList von XmlDataSource auffüllen" –

3

Ich hatte das gleiche Problem heute. Meine Lösung:

Das ist mein xml:

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

<pokemons> 
    <pokemon> 
    <nome itemname="bulbassaur">bulbassaur </nome> 
    </pokemon> 
    <pokemon> 
    <nome itemname="charmander">chamander </nome> 
    </pokemon> 
    <pokemon> 
    <nome itemname="squirtle"> squirtle </nome> 
    </pokemon> 
</pokemons> 

Und ich legte Datatextfield = "itemname" auf der Dropdownlist-Server-Steuerung. ex:

<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" 
      DataSourceID="XmlDataSource1" DataTextField="itemname"> 

Es funktioniert ohne Probleme. Wahrscheinlich nicht die beste Lösung, aber zumindest besser als System.Web.UI.WebControls.XmlDataSourceNodeDescriptor.