[LINQ] 使用 linq 讀取 XML 資料作為 DropDownList 繫結來源

沒想到這件看來簡單的事做起來還沒有那麼簡單,可能是剛好我看過的對 LINQ 的文件都沒提到。那就是,當使用 LINQ 時,到底要怎樣才能把它以動態方式繫結到 DropDownList。在網路上查了半天,還是找不到答案,結果最後自己試出來了...

沒想到這件看來簡單的事做起來還沒有那麼簡單,可能是剛好我看過的對 LINQ 的文件都沒提到。那就是,當使用 LINQ 時,到底要怎樣才能把它以動態方式繫結到 DropDownList。在網路上查了半天,還是找不到答案,結果最後自己試出來了。

XML 資料如下(members.xml):

<?xml version="1.0" encoding="utf-8" ?>
<members>
    <member name="Johnny" id="johnny" />
    <member name="Grace" id="grace" />
</members>

程式如下:

VB -

Dim doc As XDocument = XDocument.Load(Server.MapPath("members.xml"))
Dim members = From member In doc.Descendants("member") _
    Select name = member.Attribute("name").Value, id = member.Attribute("id").Value
ddl.DataSource = members
ddl.DataValueField = "id"
ddl.DataTextField = "name"
ddl.DataBind()

C# -

XElement doc = XElement.Load(Server.MapPath("members.xml"));
var members = from member in doc.Descendants("member")
              select new
              {   name = member.Attribute("name").Value,
                  id = member.Attribute("id").Value };
ddl.DataSource = members;
ddl.DataTextField = "name";
ddl.DataValueField = "id";
ddl.DataBind(); 

重點都已經使用粗體字標示出來了,請各位自行體會吧。

在上例中,如果我們希望將欄位進行排序怎麼辦?LINQ 明明有 orderby 指令可以用,但是實際上其用法並不是那麼直覺。

還好,在不用更改設計的情況下,這個問題還算好解決,也就是從原始資料著手,如下所示:

XElement doc = XElement.Load(Server.MapPath("members.xml"));
var members = from member in doc.Descendants("member")
                           orderby member.Attribute("name").Value
                           select new
                           {
                               name = member.Attribute("name").Value,
                               id = member.Attribute("id").Value
                           };
ddl.DataSource = members;
ddl.DataTextField = "name";
ddl.DataValueField = "id";
ddl.DataBind();

 如此即可。


Dev 2Share @ 點部落