很难跟随其他示例,因为他们似乎并不遵循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缺少什么,不知道&#34; colorName&#34;属性?它位于xml文件中。任何有关帮助/或更好理解的建议将不胜感激。
更新: 我正在添加用于我的转发器控件的片段,假设要绑定数据。
<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>
更新
我想我知道发生了什么。 Haven没有机会重新回到这里。我在转发器控件中绑定了两个不同的东西。我第一次将整个XML文件绑定为数据集,绑定识别文件中的colorName属性。但是在我的功能中,我从下拉列表中选择了不同的颜色,并且我的查询选择了剩余的颜色,结果是一个IEnumerable字符串。此IEnumerable仅包含我查询的文本值,因此当我尝试绑定新数据时,不知道colorName属性。我想这就是为什么我得到了我正在处理的错误。我错了所以请让我知道。
所以现在我必须找到一种方法来设置绑定两个不同的东西。如果我发现的是问题,任何人都有任何建议吗?
答案 0 :(得分: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以上将选择未在下拉列表中选择的所有颜色名称字符串。
嗯......但是我真的不明白这与你发布的问题标题的错误信息有什么关系..更新:
原来你还有另一个问题,我认为在你的约束声明中。绑定期望绑定源是具有名为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
。