Привязка данных: «System.Xml.linq.XElement» не содержит свойство с именем «colorName»

1

Нелегко следовать другим примерам, так как они не соответствуют следующему XML. В основном я пытаюсь связать список данных, которые я запрашиваю (LINQ to XML), на объект ретранслятора. Вот мой xml файл фокуса

<?xml version="1.0" encoding="utf-8" ?>
<colors>
  <color>
    <id>1</id>
    <colorName>Red</colorName>
  </color>

 <color>
    <id>2</id>
    <colorName>Orange</colorName>
 </color>

  <color>
    <id>3</id>
    <colorName>Yellow</colorName>
  </color>

  <color>
    <id>4</id>
    <colorName>Green</colorName>
  </color>

  <color>
    <id>5</id>
    <colorName>Blue</colorName>
  </color>

  <color>
    <id>6</id>
    <colorName>Indigo</colorName>
  </color>

  <color>
    <id>7</id>
    <colorName>Violet</colorName>
  </color>
</colors>

Вот мой код, который будет отвечать на событие с выпадающим меню:

    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        //Grab data from selected index
        string color = DropDownList1.SelectedValue;
        string inputUrl = "C:/Users/JJ/Documents/Visual Studio 2012/Projects/Colors/Colors/Xml/Colors.xml";

        using (XmlReader reader = XmlReader.Create(inputUrl))
        {
            //Read through xml file
            while (reader.Read())
            {
                //Creating the xml document object for use of the xml file
                XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.Load(reader);

                //Creating a xDocument object for querying purposes
                XDocument colors = XDocument.Load(inputUrl);


                //List that will contain all the colors of the xml file
                XmlNodeList nameList = xmlDoc.GetElementsByTagName("colorName");
                int colorIndex = Convert.ToInt32(color)-1;

                //Will display the output in a header based off the dropdown selection
                switch (color)
                {
                    case "1":
                        outputLabel1.Text = "My favorite color is " + nameList[colorIndex].InnerXml;
                        break;
                    case "2":
                        outputLabel1.Text = "My favorite color is " + nameList[colorIndex].InnerXml;
                        break;
                    case "3":
                        outputLabel1.Text = "My favorite color is " + nameList[colorIndex].InnerXml;
                        break;
                    case "4":
                        outputLabel1.Text = "My favorite color is " + nameList[colorIndex].InnerXml;
                        break;
                    case "5":
                        outputLabel1.Text = "My favorite color is " + nameList[colorIndex].InnerXml;
                        break;
                    case "6":
                        outputLabel1.Text = "My favorite color is " + nameList[colorIndex].InnerXml;
                        break;
                    case "7":
                        outputLabel1.Text = "My favorite color is " + nameList[colorIndex].InnerXml;
                        break;
                    default:
                        outputLabel1.Text = "Please choose a color.";
                        break;
                }

                outputLabel2.Text = "List of colors remaining: ";

                var colorsLeft = from _id in colors.Descendants("colorName")
                                 //where _id.Element("id").Value != color
                                 select _id.Value;


                Repeater1.DataSource = colorsLeft;
                Repeater1.DataBind();                   
            }
        }
    }

Что мне не хватает для моего XElement, чтобы не знать свойства "colorName"? Это в файле xml. Будут оценены любые предложения о помощи/или лучшем понимании.

UPDATE: Я добавляю кусок для моего ретрансляторного элемента управления, который предположительно связывает данные.

<asp:Repeater ID="Repeater1" runat="server">
    <ItemTemplate>
        <table>
            <tr>
                <td>
                    <asp:Label runat="server" ID="Label1" Text='<%# Bind("colorName") %>' />
                </td>
            </tr>
        </table>
    </ItemTemplate>
</asp:Repeater>

ОБНОВИТЬ:

Кажется, я знаю, что происходит. У меня не было хороших шансов вернуться к этому. Я привязываю две разные вещи в своем управлении ретранслятором. В первый раз я связываю весь XML файл как набор данных, и привязка распознает свойство colorName в файле. Однако в моей функциональности, когда я выбираю другой цвет из раскрывающегося списка, а мой запрос выбирает оставшиеся цвета, результирующая строка является IEnumerable String. Этот IEnumerable содержит только те текстовые значения, которые я запросил, чтобы не знать свойства colorName при попытке привязать новые данные. Я думаю, именно поэтому я получаю ошибку, с которой сталкиваюсь. Я мог ошибаться, поэтому, пожалуйста, дайте мне знать иначе.

Так что теперь я должен найти способ настроить привязку двух разных вещей. Если то, что я нашел, есть проблема, у кого есть какие-то предложения?

Теги:
linq

1 ответ

0

Согласно вашему комментарию, проблема заключается в LINQ-to-XML. Поэтому я бы предложил попробовать эту LINQ:

var colorsLeft = from c in colors.Descendants("color")
                 where (string)c.Element("id") != color
                 select (string)c.Element("colorName");

Выше LINQ выберет строку всех имен цветов, которые не выбраны в раскрывающемся списке.

Mmm.. но я действительно не понимаю, как это относится к сообщению об ошибке, которое вы отправили в качестве названия вопроса.

ОБНОВИТЬ :

Оказалось, что у вас есть еще одна проблема, которая, как мне кажется, находится в вашем обязательном заявлении. Связывание colorName источника привязки представляет собой набор объектов, имеющих свойство с именем colorName. Вы можете изменить привязку или изменить LINQ, чтобы исправить ошибку.

Поскольку я не могу видеть вашу привязку, я могу привести только пример для последнего:

var colorsLeft = from c in colors.Descendants("color")
                 where (string)c.Element("id") != color
                 select new { colorName = (string)c.Element("colorName") };

Над LINQ возвращает коллекцию анонимного объекта с единственным свойством colorName.

  • 0
    Я ценю вашу помощь, но теперь я получаю ту же ошибку, относящуюся к строке DataBinding: «System.String» не содержит свойства с именем «colorName».
  • 0
    Да, это то, что я начал думать прошлой ночью. Вот мой кусок на странице aspx для контроля повторителя. <asp: Label runat = "server" ID = "Label1" Text = '<% # Bind ("colorName")%>' />

Ещё вопросы

Сообщество Overcoder
Наверх
Меню