GridView裏的Button

    當用戶點擊一個Button(位於FormView內部EdiTemplate)時,頁面會回發,FormView的ItemCommand event被激發.我們可以爲這個事件創建一個event handler ,用來在Button 被點擊時執行自定義代碼。注意:任何時候FormView裏的任何Button, LinkButton, 或 ImageButton被點擊時,ItemCommand 事件都會被激發.這意味着當用戶在FormView裏從一個頁面跳到另一個頁面時,ItemCommand 事件會被激發.當用戶點擊一個支持inserting, updating, 或 deleting的FormView裏的New, Edit, 或 Delete 時,ItemCommand 事件會被激發。(要熟悉FormView的構造)   既然無論點擊什麼button時, ItemCommand 都會被激發,那麼在event handler裏我們需要判斷是“Discontinue All Products” Button 被點擊了還是其它的button.爲了達到這個目的,可以通過設置Button 的CommandName來識別. 當Button 被點擊後,CommandName 的值被傳到ItemCommand 的event handler,我們通過這個值來判斷被點擊的button是否是“Discontinue All Products” Button。設置“Discontinue All Products” Button的CommandName 爲“DiscontinueProducts”。

C#
protected void Suppliers_ItemCommand(object sender, FormViewCommandEventArgs e)
{
if (e.CommandName.CompareTo("DiscontinueProducts") == 0)
     {
            // The "Discontinue All Products" Button was clicked.
            // Invoke the ProductsBLL.DiscontinueAllProductsForSupplier(supplierID) method
            // First, get the SupplierID selected in the FormView
       int supplierID = (int)Suppliers.SelectedValue;
            // Next, create an instance of the ProductsBLL class
       ProductsBLL productInfo = new ProductsBLL();   //此處爲何不使用Adapter?
            // Finally, invoke the DiscontinueAllProductsForSupplier(supplierID) method
       productInfo.DiscontinueAllProductsForSupplier(supplierID);
      }
}

 

    GridView, DetailsView, 和FormView都可以包含Buttons, LinkButtons, 或ImageButtons.這些button被點擊時,頁面回發,並激發FormView 和DetailsView 的ItemCommand 事件,GridView的RowCommand 事件.除了可以執行本身內置的功能外,還可以使用執行自定義代碼的button.爲了達到這個目的,需要爲ItemCommand 或 RowCommand 創建一個event handler(事件處理程序). 在這個event handler 裏我們首先檢查CommandName 的值來判斷哪個button被點擊了,然後執行相應的自定義代碼.

    注意:任何時候FormView裏的任何Button,LinkButton, 或 ImageButton被點擊時,ItemCommand 事件都會被激發.這意味着當用戶在FormView裏從一個頁面跳到另一個頁面時,ItemCommand 事件會被激發.當用戶點擊一個支持inserting, updating, 或 deleting的FormView裏的New,Edit, 或 Delete 時,ItemCommand 事件會被激發. 以下爲自定義功能實現的代碼段:

C#
protected void SuppliersProducts_RowCommand(object sender, GridViewCommandEventArgs e)
{
if (e.CommandName.CompareTo("IncreasePrice") == 0 ||e.CommandName.CompareTo("DecreasePrice") == 0)
     {
              // The Increase Price or Decrease Price Button has been clicked
              // Determine the ID of the product whose price was adjusted
       int productID =(int)SuppliersProducts.DataKeys[Convert.ToInt32(e.CommandArgument)].Value;

/*e.CommandArgument是用來獲取button所在row的rowIndex。此時e.CommandName爲Button所設置的CommandName。DataKeys獲取一個 DataKey(數據綁定控件中某個記錄的一個或多個主鍵字段) 對象集合,這些對象表示 GridView 控件中的每一行的數據鍵值。類CommandEventArgs有兩個公共屬性,CommandName(用來獲取命令的名稱)和CommandArgument(用來獲取命令的參數)*/
              // Determine how much to adjust the price decimal percentageAdjust;
        if (e.CommandName.CompareTo("IncreasePrice") == 0)
            percentageAdjust = 1.1M;

/*從Double類型到Decimal的顯示轉換(整型可以隱式轉換爲Decimal類型,不必在後面加M,詳情見下方的MSDN查閱)*/
        else
            percentageAdjust = 0.9M;
              // Adjust the price
            ProductsBLL productInfo = new ProductsBLL();
            productInfo.UpdateProduct(percentageAdjust, productID);
      }
}
     爲了判斷被點擊“Price +10%” or “Price -10%” button 的那一行的ProductID ,我們需要用到GridView的DataKeys集合.這個集合包含了GridView 的行的所有值.由於GridView在綁定到ObjectDataSource時,DataKeyNames 被Visual Studio設置爲ProductID ,DataKeys(rowIndex).Value 提供了指定rowIndex的ProductID .ButtonField 會將被點擊的button所在row 的rowIndex 自動傳到e.CommandArgument 參數裏.(e.CommandName爲當前點擊的Button的CommandName,此處Button爲當前行的一個ButtonField)因此,用Convert.ToInt32(SuppliersProducts.DataKeys(Convert.ToInt32(e.CommandArgument)).Value)來獲取被點擊“Price +10%” or “Price -10%” button的行的ProductID . 和“Discontinue All Products” button裏一樣,如果你禁用了GridView的view state屬性,每次postback時GridView 都會重新綁定。 如果你不這麼做,你需要手動再次綁定。

    注意:GridView (和DetailsView)同樣可以將Buttons,LinkButtons或ImageButtons 加到TemplateFields裏.和BoundField一樣,這些Button被點擊時會產生回發,觸發GridView的RowCommand 事件.當添加button到TemplateField裏時,button的CommandArgument不會像使用ButtonFields一樣,被自動設置爲row 的index .如果你需要在RowCommand的event handler裏判斷點擊的button所在行的index ,你需要在TemplateField的頁面代碼裏使用以下代碼來設置button的CommandArgument 屬性:
<asp:Button runat="server" ... CommandArgument='<%# CType(Container, GridViewRow).RowIndex %>' />


以下爲查閱MSDN中的相關內容:
    GridView.DataKeys 屬性獲取一個 DataKey 對象集合,這些對象表示 GridView 控件中的每一行的數據鍵值。


屬性值
    一個 DataKeyArray,其中包含 GridView 控件中每一行的數據鍵。


備註
    當設置了 DataKeyNames 屬性時,GridView 控件自動爲該控件中的每一行創建一個 DataKey 對象。DataKey 對象包含在DataKeyNames 屬性中的指定的字段的值。DataKey 對象隨後被添加到控件的 DataKeys 集合中。使用 DataKeys 屬性檢索 GridView 控件中特定數據行的 DataKey 對象。

注意
    可使用 SelectedDataKey 屬性檢索當前選中行的 DataKey 對象。還可以使用 SelectedValue 屬性直接檢索當前選中行的數據鍵值。DataKeyArray 類表示DataKey 對象的集合。無法繼承此類。


備註
    DataKeyArray 類用於存儲和管理 DataKey 對象的集合。DataKey 對象表示數據綁定控件中某個記錄的主鍵。通常情況下,顯示多個記錄的數據綁定控件(如 GridView 控件)使用 DataKeyArray 對象來存儲該控件中顯示的記錄的DataKey 對象。

    DataKeyArray 類支持多種訪問集合中的項的方法:使用 Item 索引器直接從集合中從零開始的特定索引位置檢索 DataKey 對象。使用 GetEnumerator 方法檢索可用於循環訪問集合的枚舉數。使用 CopyTo 方法將集合中的項複製到數組,然後可使用該數組訪問集合中的項。若要確定集合中的總項數,請使用 Count 屬性。

 

    DataKey 類 表示數據綁定控件中某個記錄的一個或多個主鍵字段。 DataKey 類用於表示數據綁定控件中某個記錄的主鍵。記錄的主鍵可以由數據源中的一個或多個字段組成。儘管 DataKey 類不是集合,但它可以存儲多個鍵字段值。當調用 DataKey 類的某個構造函數時,將填充鍵字段值。可以通過以下方法從 DataKey 對象中檢索鍵字段值:使用 DataKey.Item(Int32) 屬性檢索 DataKey 對象中特定索引位置的鍵字段值。使用 DataKey.Item(String) 屬性檢索特定字段的鍵字段值。使用 Value 屬性檢索 DataKey 對象中索引 0 位置的鍵字段值。當主鍵只包含一個字段時,此屬性常用作檢索記錄鍵值的快捷方式。使用 Values 屬性創建可用於循環訪問鍵字段值的 IOrderedDictionary 對象。通常,當設置了數據綁定控件的 DataKeyNames 屬性時,控件自動生成 DataKey 對象。DataKey 對象包含DataKeyNames 屬性中指定的一個或多個鍵字段的值。一次顯示一個記錄的數據綁定控件(如 DetailsView 或 FormView)通常在它的 DataKey 屬性中存儲所顯示的當前記錄的 DataKey 對象。一次顯示多個記錄的數據綁定控件(如GridView)通常在 DataKeyArray 集合中存儲它的每個記錄的 DataKey 對象。然後,DataKeyArray 集合將存儲在控件的 DataKeys 屬性中。

關於decimal類型(C# 參考)
    decimal關鍵字表示 128 位數據類型。同浮點型相比,decimal類型具有更高的精度和更小的範圍,這使它適合於財務和貨幣計算。decimal 類型的大致範圍和精度如下表所示。

類型             大致範圍                                               精度               .NET Framework 類型
decimal      ±1.0 × 10e−28至±7.9 × 10e28   28到29位有效位        System.Decimal

標識符
    如果希望實數被視爲 decimal 類型,請使用後綴 m 或 M,例如:decimal myMoney = 300.5m;如果沒有後綴 m,數字將被視爲 double 類型,從而導致編譯器錯誤。

轉換
    整型被隱式轉換爲 decimal,其計算結果爲 decimal。因此,可以用整數初始化十進制變量而不使用後綴,如下所示:
          decimal myMoney = 300;

    在浮點型和 decimal 類型之間不存在隱式轉換;因此,必須使用強制轉換在這兩種類型之間進行轉換。例如:decimal myMoney = 99.9m; double x = (double)myMoney; myMoney = (decimal)x;
還可以在同一表達式中混合使用 decimal 和數值整型。但是,不進行強制轉換就混合使用 decimal 和浮點型將導致編譯錯誤。

 

    本章到此結束,總的來講還是通過學習一個簡單的功能來帶出內部控件之間的一些編碼和控件內部命令及其聯繫的一些用法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章