2009-03-10 4 views
2

Я хотел бы, чтобы заполнить свой DropDownList, используя простой XML-файл:Populate DropDownList из XmlDataSource

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

Мой XPath является

/Databases/Database 

Мой выпадающий список отображается как:

<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> 

Как извлечь текст?

Благодаря

ответ

7

Я не могу вспомнить с верхней части моей головы, но я думаю, что там была ошибка в XmlDataSource, что мешает вам привязать к значениям XML-узлов. Он работает только с атрибутами. Пожалуйста, поправьте меня, если я ошибаюсь. Там есть небольшая модификация вам необходимо сделать в файл XML:

, что я добавил имя атрибут вместо того, чтобы использовать значение узла непосредственно
<%@ 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> 

Примечание.

Если вы не можете изменить структуру исходного XML-файла, вы можете применить к нему преобразование XSLT, используя свойство TransformFile, как описано в этом post.

-1

Вот один из способов сделать это - вы можете проецировать массив ListItems в запросе LINQ:

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, но я хочу «Залить DropDownList из XmlDataSource» –

3

У меня была такая же проблема сегодня. Мое решение:

Это мой 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> 

И я поставил DataTextField = "ItemName" на элементе управления DropDownList сервера. например:

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

Он работает без проблем. Наверное, это не лучшее решение, но, по крайней мере, лучше, чем System.Web.UI.WebControls.XmlDataSourceNodeDescriptor.