作者Deadshot465 (十三)
看板Web_Design
標題Re: [問題] asp.net 2.0 gridview hyperlinkfield …
時間Mon Oct 25 06:15:29 2010
大大的程式碼小弟認為重點差不多有以下兩點:
1.SELECT出的欄位
2.GridView各個Field的順序安排
從程式碼中可看出,大大的GridView有三個欄位,
從左至右分別是CommandField,BoundField和HyperLinkField。
雖然所用資料庫不同,但小弟至少前三欄會盡量按照此安排去做。
原則上正如前面幾位大大所述,
要做到這點的重點在於GridView的RowDataBound事件。
從字面的意思可約略看出這個事件是在GridView每一列資料進行資料繫結時所觸發,
參數有object sender和GridViewRowEventArgs e兩個,
而這段程式重點在於e的運用。
(新增事件小弟就不贅述了,在屬性視窗切換到事件頁次,雙擊RowDataBound兩下)
雖然原理相同,但小弟想得到的兩種方法分別為:
I.在RowDataBound時判斷每筆資料的檔案下載是否有檔案
II.在資料庫多新增一個欄位專責紀錄是否有檔案
底下為第一種的寫法,
C#程式碼如下(命名空間煩請自行using):
//Protected Sub GridView1_RowDataBound(ByVal sender As Object, _
// ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) _
// Handles GridView1.RowDataBound
protected void GridView1_RowDataBound(object sender,
GridViewRowEventArgs e)
{
//e.Row.DataItem可取得當前進行資料繫結的紀錄(列)
//但要注意的是e.Row是指GridViewRow
//e.Row.DataItem才是繫結的資料列本身
//VB.NET:Dim drv As DataRowView = CType(e.Row.DataItem, DataRowView)
DataRowView drv = (DataRowView)e.Row.DataItem;
//GridView頁首顯示欄位名稱的部分也算是Rows的其中之一
//但實際上e.Row.DataItem在這列會傳回null(Nothing)
//所以利用if來避免程式擲回NullReferenceException
//VB.NET:If Not (drv Is Nothing) Then
if (drv != null)
{
//這邊也可使用IsDBNull()來判定
//判定該筆資料的該欄位是否為null值或空白
//VB.NET:If String.IsNullOrEmpty(drv("檔案下載").ToString()) Then
if (string.IsNullOrEmpty(drv["檔案下載"].ToString()))
{
//取得GridView中該筆資料的第三欄(0, 1, 2)
//這邊用GetType可以知道是HyperLink而不是HtmlAnchor
//Row是指在GridView中的這一列(這筆資料)
//Cells[2]是取得該列的第三欄
//Controls[0]是取得該欄位中第一個控制項
//VB.NET:Dim hl As HyperLink = _
//CType(e.Row.Cells(5).Controls(0), HyperLink)
HyperLink hl = (HyperLink)e.Row.Cells[2].Controls[0];
//設定連結為null值,即沒有連結位址
//VB.NET:hl.NavigateUrl = Nothing
hl.NavigateUrl = null;
}
//End If
/* 到這邊原則上GridView就會呈現出大大想要的樣子了,
但由於為了說明底下的第二種方法,
所以先不把if結尾(因為第二種方法也需要避免NullReferenceException)。
在這裡假設SqlDataSource SELECT出的專門記錄有無檔案的欄位叫fileExists,
其值為bool(Boolean)。 */
//VB.NET:If CBool(drv("fileExists")) = False Then
if (((bool)drv["fileExists"]) == false)
{
//在這邊進行與上面相同的動作
}
}
}
以上兩種方法大致上就是小弟想得到的解決方法了,
另外GridViewRowEventArgs e,
除了上述的e.Row.DataItem可取得當前進行資料繫結的列外,
在轉成DataRowView後還可以透過drv.DataView取得其所屬的DataView,
drv.DataView.Table取得整個SELECT出的DataTable,
drv.DataView.Table.DataSet取得DataTable所屬的DataSet。
若有錯煩請不吝指教:)。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 219.70.231.208
※ 編輯: Deadshot465 來自: 219.70.231.208 (10/25 06:16)
※ 編輯: Deadshot465 來自: 219.70.231.208 (10/25 06:17)
※ 編輯: Deadshot465 來自: 219.70.231.208 (10/25 06:21)
推 KenZ:專業 10/25 09:54
推 nbhd0815:已經試成功了感謝大大 10/28 01:13