沒想到這件看來簡單的事做起來還沒有那麼簡單,可能是剛好我看過的對 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();
如此即可。