首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET 2.0 資料教程 64:批次更新實作-GridView 全列編輯模式、TemplateField 轉換、事務包裝與 UpdateAll 按鈕

     編輯:關於ASP.NET

前言

預設 GridView 單列編輯 (EditIndex)。批次更新需所有列同時進入編輯模式。解法:將 BoundField 轉為 TemplateField,在 ItemTemplate 直接放入編輯控制項 (TextBox, DropDownList),配合「更新所有」按鈕與事務。

實作步驟

1. 建立 GridView 與 ObjectDataSource

<asp:GridView ID="gvProducts" runat="server" AutoGenerateColumns="False" 
    DataSourceID="odsProducts" DataKeyNames="ProductID">
    <Columns>
        <asp:TemplateField HeaderText="產品名稱">
            <ItemTemplate>
                <asp:TextBox ID="txtProductName" runat="server" 
                    Text='<%# Bind("ProductName") %>' />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="單價">
            <ItemTemplate>
                <asp:TextBox ID="txtUnitPrice" runat="server" 
                    Text='<%# Bind("UnitPrice", "{0:N2}") %>' />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:CheckBoxField DataField="Discontinued" HeaderText="停產" />
        <asp:TemplateField HeaderText="類別">
            <ItemTemplate>
                <asp:DropDownList ID="ddlCategory" runat="server" 
                    DataSourceID="odsCategories" DataTextField="CategoryName" 
                    DataValueField="CategoryID" SelectedValue='<%# Bind("CategoryID") %>' />
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

2. 「更新所有」按鈕事件

protected void btnUpdateAll_Click(object sender, EventArgs e)
{
    using (TransactionScope scope = new TransactionScope())
    {
        foreach (GridViewRow row in gvProducts.Rows)
        {
            // 取得控制項值
            TextBox txtName = row.FindControl("txtProductName") as TextBox;
            TextBox txtPrice = row.FindControl("txtUnitPrice") as TextBox;
            DropDownList ddlCat = row.FindControl("ddlCategory") as DropDownList;
            CheckBox chkDisc = row.FindControl("chkDiscontinued") as CheckBox;
            int productID = (int)gvProducts.DataKeys[row.RowIndex].Value;

            // 呼叫 BLL 更新 (需擴充接受所有欄位)
            ProductsBLL.UpdateProduct(productID, txtName.Text, 
                decimal.Parse(txtPrice.Text), int.Parse(ddlCat.SelectedValue), chkDisc.Checked);
        }
        scope.Complete();
    }
    gvProducts.DataBind();
}

關鍵設計點

  • 不使用 EditIndex,直接在 ItemTemplate 放編輯控制項,所有列同時可編輯。
  • Bind 雙向繫結 確保值能回寫(雖本範例手動取值更新)。
  • TransactionScope 確保全部成功或全部回滾。
  • CheckBoxField 保持原樣,自動呈現啟用/停用核取方塊。

結語

批次更新透過 TemplateField 實現全列編輯,配合事務確保資料一致性。適合後台管理、試算表式資料維護情境。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved