我的主题数据如下所示:
010000 <- Top level header
010100 A <- Sub level header
010101 B <- Clickable item in the select list
010102 C <- Clickable item in the select list
010103 D <- Clickable item in the select list
010200 E <- Sub level header
010201 F <- Clickable item in the select list
010202 G <- Clickable item in the select list
目前我正在使用以下代码制作一个显示everthing的选择列表:
var topics = contentService.Get(accountID + "06000").OrderBy(o => o.Order);
foreach (Content topic in topics) {
txt += "<option value='" + topic.RowKey + "'>" + topic.Name + "</option>\n";
}
有没有办法可以改变这个:
这样的团体:
<select>
<optgroup label="A">
<option value="010101">B</option>
<option value="010102">C</option>
<option value="010103">D</option>
</optgroup>
<optgroup label="E">
<option value="010201">F</option>
<option value="010202">G</option>
</optgroup>
</select>
我希望有人可以提供帮助。我想也许我可以做限制但我不知道如何进行开始和结束分组。
答案 0 :(得分:2)
嗯,RowKey的内容并不是很清楚。但是我们说RowKey是“01xxxx”。不知道“A,B,C ......”是否属于同一个字符串......
var groupedList = topics.Where(m => m.RowKey.Substring(2, 2) != "00")
.GroupBy(m => m.RowKey.Substring(2, 2))
.ToList();
然后你可以像
一样使用它var select = new XElement("select");
foreach (var group in groupedList) {
var subLevel = group.First();
var optGroup = new XElement("optGroup", new XAttribute("label", subLevel.Name);
optGroup.
sb.Append(
foreach (var item in group.Skip(1).ToList()) {
optGroup.Add(new XElement("option", new XAttribute("value", item.RowKey), new XText(item.Name)));
}
select.Add(optGroup);
}
var result = select.ToString();
如果您有其他以“02”,“03”等开头的群组,则必须先对topic.Substring(0, 2)
进行首次分组。
答案 1 :(得分:2)
为了简化问题,我们假设您的主题在以下List
中定义:
List<Tuple<string, string>> topics = new List<Tuple<string, string>>
{
Tuple.Create("010000", string.Empty),
Tuple.Create("010100", "A"),
Tuple.Create("010101", "B"),
Tuple.Create("010102", "C"),
Tuple.Create("010103", "D"),
Tuple.Create("010200", "E"),
Tuple.Create("010201", "F"),
Tuple.Create("010202", "G"),
};
然后,您可以简单地遍历每个主题并逐步构建HTML:
XElement select = new XElement("select");
XElement optGroup = null;
foreach (var topic in topics)
{
// skip root topic
if (!topic.Item1.EndsWith("0000"))
{
// optgroup
if (topic.Item1.EndsWith("00"))
{
optGroup = new XElement("optgroup", new XAttribute("label", topic.Item2));
select.Add(optGroup);
}
// option
else if (optGroup != null)
{
optGroup.Add(new XElement("option", new XAttribute("value", topic.Item1), new XText(topic.Item2)));
}
}
}
Console.WriteLine(select);
您将获得以下控制台输出:
<select>
<optgroup label="A">
<option value="010101">B</option>
<option value="010102">C</option>
<option value="010103">D</option>
</optgroup>
<optgroup label="E">
<option value="010201">F</option>
<option value="010202">G</option>
</optgroup>
</select>