Нелегко следовать другим примерам, так как они не соответствуют следующему 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-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
.