DropDownList aus XmlDataSource auffüllen

Ich möchte meine DropDownList mit einer einfachen XML-Datei auffüllen:

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

Mein XPath ist

/Databases/Database

Meine Dropdown-Liste wird wie folgt 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 auf "DropDownList aus XmlDataSource auffüllen " 3 von antworten

Ich kann mich nicht von oben an meinen Kopf erinnern, aber ich denke, es gab einen Fehler in XmlDataSource, der Sie daran hindert, an Werte von XML-Knoten zu binden. Es funktioniert nur mit Attributen. Bitte korrigieren Sie mich, wenn ich damit falsch bin. Es gibt eine leichte Änderung, die Sie an Ihrer 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>

Beachten Sie, dass ich den Namen Attribut hinzugefügt habe, anstatt 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 mit der TransformFile property as described in this -Eigenschaft anwenden, wie in diesem post. beschrieben.

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

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()
);
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. .

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

Dies ist meine 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 habe DataTextField="itemname" auf das DropDownList-Serversteuerelement gesetzt.