Заполнить DropDownList из XmlDataSource - PullRequest
2 голосов
/ 10 марта 2009

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

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

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

Спасибо

Ответы [ 3 ]

8 голосов
/ 10 марта 2009

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

Обратите внимание, что я добавил атрибут name вместо непосредственного использования значения узла.

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

3 голосов
/ 06 августа 2009

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

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

0 голосов
/ 10 марта 2009

Вот один из способов сделать это - вы можете проецировать массив 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()
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...