傳統 GridView 編輯流程要求使用者點擊「編輯」按鈕進入編輯模式,修改完再點「更新」或「取消」,操作步驟繁瑣。若能直接在列表中顯示可編輯的文字方塊,使用者即可就地修改,體驗將大幅提升。
核心在於:捨棄 EditItemTemplate,直接在 ItemTemplate 中放置 TextBox 控制項,並搭配 CommandName="Update" 的按鈕觸發更新事件。如此一來,GridView 永遠處於「顯示模式」,但每一列其實都是可編輯狀態。
以下結合 asp:Table 作為新增列,GridView 負責列表顯示與編輯:
<asp:Table ID="Table1" runat="server" CssClass="table" CellPadding="2" CellSpacing="0">
<asp:TableHeaderRow Height="20" BackColor="#efebde" BorderWidth="1" BorderColor="#c0c0c0">
<asp:TableHeaderCell BackColor="#efebde" BorderWidth="1" BorderColor="#c0c0c0">Chinese Name</asp:TableHeaderCell>
<asp:TableHeaderCell BackColor="#efebde" BorderWidth="1" BorderColor="#c0c0c0" Width="50%">English Name</asp:TableHeaderCell>
<asp:TableHeaderCell BackColor="#efebde" BorderWidth="1" BorderColor="#c0c0c0" Width="10%">Edit</asp:TableHeaderCell>
</asp:TableHeaderRow>
<asp:TableRow Height="20">
<asp:TableCell BorderWidth="1" BorderColor="#c0c0c0"><asp:TextBox ID="txt_CName" runat="Server" /></asp:TableCell>
<asp:TableCell BorderWidth="1" BorderColor="#c0c0c0"><asp:TextBox ID="txt_EName" runat="Server" /></asp:TableCell>
<asp:TableCell BorderWidth="1" BorderColor="#c0c0c0"><asp:Button ID="ButtonInsert" Text="Insert" runat="Server" OnClick="ButtonInsert_Click" /></asp:TableCell>
</asp:TableRow>
</asp:Table>
<asp:GridView ID="GvCutterType" runat="server" DataKeyNames="CutterTypeId" AutoGenerateColumns="false"
CellPadding="2" CellSpacing="0" Width="100%" BorderWidth="0" BorderColor="#c0c0c0"
OnRowDeleting="GvCutterType_OnDeleteCommand" OnRowUpdating="GvCutterType_OnUpdateCommand"
RowStyle-Height="20" ShowHeader="false">
<Columns>
<asp:TemplateField>
<ItemStyle BorderWidth="1" BorderColor="#c0c0c0" />
<ItemTemplate>
<asp:TextBox ID="txtCName" runat="server" Text='<%# Eval("CName") %>'></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
<ItemStyle BorderWidth="1" BorderColor="#c0c0c0" Width="50%" />
<ItemTemplate>
<asp:TextBox ID="txtEName" runat="server" Text='<%# Eval("EName") %>'></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="編輯">
<ItemStyle BorderWidth="1" BorderColor="#c0c0c0" Width="5%" />
<ItemTemplate>
<asp:Button ID="Button1" runat="server" CommandName="Update" Text="Update" />
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="刪除">
<ItemStyle BorderWidth="1" BorderColor="#c0c0c0" Width="5%" />
<ItemTemplate>
<asp:Button ID="Button2" runat="server" CommandName="Delete" Text="Delete" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
protected void ButtonInsert_Click(object sender, EventArgs e)
{
// 新增邏輯
}
protected void GvCutterType_OnUpdateCommand(object sender, GridViewUpdateEventArgs e)
{
// 更新邏輯:從 e.NewValues 或透過 FindControl 取得 TextBox 值
}
protected void GvCutterType_OnDeleteCommand(object sender, GridViewDeleteEventArgs e)
{
// 刪除邏輯
}
| 優點 | 缺點 |
|---|---|
| 介面簡潔,無模式切換閃爍 | 所有列同時顯示編輯控制項,資料量大時效能較差 |
| 程式碼較簡單,不需處理 Edit/Cancel 事件 | 缺乏內建驗證機制,需自行實作前後端驗證 |
| 適合少量資料、頻繁微調的後台管理 | 不支援 EditItemTemplate 的進階樣式切換 |
此模式適合「參數設定」、「字典維護」等資料筆數較少、欄位簡單的後台管理頁面。若資料量超過 50 筆或包含複雜下拉選單、日期選擇器,建議改用 ListView 搭配客製化編輯模板,或採用前端框架(如 Vue/React)配合 Web API 實作 SPA 風格編輯體驗。