1

私は次のようなトピックデータを持っています:

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

現在、私は次のコードを使用して、すべてを表示する選択リストを作成しています。

var topics = contentService.Get(accountID + "06000").OrderBy(o => o.Order);
foreach (Content topic in topics) {
    txt += "<option value='" + topic.RowKey + "'>" + topic.Name + "</option>\n";
}

これを次のように変更する方法はありますか?

  • トップレベルのヘッダーは選択リストの一部ではありませんか?つまり、「0000」で終わるすべての行がトピック変数に入れられるわけではありません。
  • サブレベルのヘッダーは、選択リストにグループとして表示されます。

このようなグループ:

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

誰かが助けてくれることを願っています。制限はできるかもしれませんが、グループ化の開始と終了の方法がわかりません。

4

2 に答える 2

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)

于 2012-07-22T14:29:10.487 に答える
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>
于 2012-07-22T14:48:22.110 に答える