讀者 hwangtw 的問題與解答

摘要:讀者 hwangtw 的問題與解答

問題 

hwangtw  
2007-05-27 11:39:02  
再請問老師:
1.
為何與CH3_DemoForm007類似的例子---CH3_DemoForm035
(
我發現主要只差在後著的SqlDataSource ProductsDataSource是擺在較內層)
CH3_DemoForm035.aspx.vb的下列三行:
Dim s As SqlDataSource = CType(e.Row.FindControl("ProductsDataSource"), SqlDataSource)
Dim r As System.Data.DataRowView = CType(e.Row.DataItem, System.Data.DataRowView)
s.SelectParameters("CategoryID").DefaultValue = r("
類別編號").ToString()
改為類如原CH3_DemoForm007.aspx.vb有瑕疵語法的這一行:
Me.ProductsDataSource.SelectParameters("CategoryID").DefaultValue = DataBinder.Eval(e.Row.DataItem, "
類別編號").ToString
就可以呢? 

2.而修正後的CH3_DemoForm007.aspx.vb為何能修正呢?
可再說明些嗎?
謝謝!

解答

非常感謝您對章立民研究室的支持,關於您的問題,說明如下。

大家必須瞭解,要於執行階段取得資料值的手法本來就不只一種。其實我們在書中的不同範例是刻意使用下面兩種不同寫法,只不過未特別加以說明罷了:

'
第一道陳述式用於取得位於某資料行當中的 SqlDataSource 物件
Dim s As SqlDataSource = _
  CType(e.Row.FindControl("ProductsDataSource"), SqlDataSource)
Dim r As System.Data.DataRowView = _
  CType(e.Row.DataItem, System.Data.DataRowView)
s.SelectParameters("CategoryID").DefaultValue = _
  r("
類別編號").ToString()

-或-

Me.ProductsDataSource.SelectParameters("CategoryID").DefaultValue = DataBinder.Eval(e.Row.DataItem, "類別編號").ToString

 

重點是,CH3_DemoForm007.aspx 原先的瑕疵之處不在於取得所要篩選之資料值的手法,而在於資料來源繫結的時機。請注意,新版本的 CH3_DemoForm007.aspx 主要做了以下兩項修正:

 

q SqlDataSource2 SELECT 陳述式中的 WHERE 子句移除。

q 沒有BulletedList1 繫結至 SqlDataSource2,而是完全利用 DataView 來動態設定 BulletedList1 的資料來源。

 

其實,原版本的 CH3_DemoForm007 也可以倣傚 CH3_DemoForm035.aspx 的寫法來加以修正。作法如下:
 

q SqlDataSource2 移至「產品清單」資料行的 ItemTemplate 中。

q GridView1_RowDataBound 事件處理常式改寫如下:

Protected Sub GridView1_RowDataBound( _
 ByVal sender As Object, _
 ByVal e As _
 System.Web.UI.WebControls.GridViewRowEventArgs) _
 Handles GridView1.RowDataBound
 If e.Row.RowType = DataControlRowType.DataRow Then
   Dim s As SqlDataSource = _
   CType(e.Row.FindControl("SqlDataSource2"), SqlDataSource)
   s.SelectParameters("
類別編號").DefaultValue = _
   DataBinder.Eval(e.Row.DataItem, "
類別編號").ToString
 End If
End Sub


由於
ASP.NET AJAX 經典範例 100/使用 VB一書的重點還是在於 AJAX 的部分,所以對於 ASP.NET 2.0 相關的技巧並不適宜做太多的解說,否則本書的厚度可能會達 1500 頁。此點,還請大家諒解。不論如何,還是非常感謝您的支持。

章立民研究室 2007/5/29