[研究]ASP.NET WebForm, ListView, GridView 的 ItemTemplate 中,Label的 Bind()可以改成 Eval() 嗎?
2024-02-26
環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C# + SQL Server 2019 + SQL Server Management Studio (SSMS) 19
********************************************************************************
ASP.NET WebForm, ListView 的 ItemTemplate 中,
<asp:Label ID="Label4" runat="server" Text='<%# Bind("ID") %>'>可以改成<asp:Label ID="Label4" runat="server" Text=' <%# Eval("ID") %>'> 嗎?
ChatGPT
是的,您可以將 <asp:Label> 控制項中的 Text 屬性從 <%# Bind("ID") %> 改為 <%# Eval("ID") %>。 兩者的差別在於:
- Bind:會將控制項的值綁定到資料來源,並且與資料來源雙向綁定。 如果您在控制項中變更了值,則會自動反映到資料來源中。
- Eval:只是從資料來源中檢索值,並將其顯示在控制項中。 如果您在控制項中變更了值,則不會反映到資料來源中。
在大多數情況下,如果您只需要顯示資料而不需要更改它,並且不需要與資料來源雙向綁定,那麼使用 Eval 會更合適。 因此,您可以安全地將 <asp:Label> 控制項的 Text 屬性修改為 <%# Eval("ID") %>。
********************************************************************************
【實際測試】
Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication2.Default" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> </head> <body> <form id="form1" runat="server"> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:MyDBConnectionString %>" DeleteCommand="DELETE FROM [MyTable] WHERE [SN] = @SN" InsertCommand="INSERT INTO [MyTable] ([SN], [cname]) VALUES (@SN, @cname)" SelectCommand="SELECT * FROM [MyTable]" UpdateCommand="UPDATE [MyTable] SET [cname] = @cname WHERE [SN] = @SN"> <DeleteParameters> <asp:Parameter Name="SN" Type="Int32" /> </DeleteParameters> <InsertParameters> <asp:Parameter Name="SN" Type="Int32" /> <asp:Parameter Name="cname" Type="String" /> </InsertParameters> <UpdateParameters> <asp:Parameter Name="cname" Type="String" /> <asp:Parameter Name="SN" Type="Int32" /> </UpdateParameters> </asp:SqlDataSource> <asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="SN" DataSourceID="SqlDataSource1"> <Columns> <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" /> <asp:BoundField DataField="SN" HeaderText="SN" ReadOnly="True" SortExpression="SN" /> <asp:TemplateField HeaderText="cname" SortExpression="cname"> <EditItemTemplate> <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("cname") %>'></asp:TextBox> </EditItemTemplate> <ItemTemplate> <%--<asp:Label ID="Label1" runat="server" Text='<%# Bind("cname") %>'></asp:Label>--%> <asp:Label ID="Label2" runat="server" Text='<%# Eval("cname") %>'></asp:Label> </ItemTemplate> </asp:TemplateField> </Columns> </asp:GridView> <asp:FormView ID="FormView1" runat="server" DataKeyNames="SN" DataSourceID="SqlDataSource1"> <EditItemTemplate> SN: <asp:Label ID="SNLabel1" runat="server" Text='<%# Eval("SN") %>' /> <br /> cname: <asp:TextBox ID="cnameTextBox" runat="server" Text='<%# Bind("cname") %>' /> <br /> <asp:LinkButton ID="UpdateButton" runat="server" CausesValidation="True" CommandName="Update" Text="更新" /> <asp:LinkButton ID="UpdateCancelButton" runat="server" CausesValidation="False" CommandName="Cancel" Text="取消" /> </EditItemTemplate> <InsertItemTemplate> SN: <asp:TextBox ID="SNTextBox" runat="server" Text='<%# Bind("SN") %>' /> <br /> cname: <asp:TextBox ID="cnameTextBox" runat="server" Text='<%# Bind("cname") %>' /> <br /> <asp:LinkButton ID="InsertButton" runat="server" CausesValidation="True" CommandName="Insert" Text="插入" /> <asp:LinkButton ID="InsertCancelButton" runat="server" CausesValidation="False" CommandName="Cancel" Text="取消" /> </InsertItemTemplate> <ItemTemplate> SN: <asp:Label ID="SNLabel" runat="server" Text='<%# Eval("SN") %>' /> <br /> cname: <%--<asp:Label ID="cnameLabel" runat="server" Text='<%# Bind("cname") %>' />--%> <asp:Label ID="Label1" runat="server" Text='<%# Eval("cname") %>' /> <br /> <asp:LinkButton ID="EditButton" runat="server" CausesValidation="False" CommandName="Edit" Text="編輯" /> <asp:LinkButton ID="DeleteButton" runat="server" CausesValidation="False" CommandName="Delete" Text="刪除" /> <asp:LinkButton ID="NewButton" runat="server" CausesValidation="False" CommandName="New" Text="新增" /> </ItemTemplate> </asp:FormView> </form> </body> </html> |
Default.aspx.cs
預設內容 |
(下圖)實際測試,Bind 換成 Eval 後,使用 "編輯" 功能仍正常。
********************************************************************************
[研究]ASP.NET WebForm, GridView, FormView 的 ItemTemplate 中,Label 為何預設使用 Bind,而非用 Eval ?
2024-02-26
環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C# + SQL Server 2019 + SQL Server Management Studio (SSMS) 19
********************************************************************************
ASP.NET WebForm, GridView 的 ItemTemplate 中,Label 為何預設使用 Bind,而非用 Eval ?
<ItemTemplate>
<asp:Label ID="Label1" runat="server" Text='<%# Bind("cname") %>'></asp:Label>
</ItemTemplate>
ChatGPT
在ASP.NET WebForms中,GridView的ItemTemplate中預設使用Bind而不是Eval,可能是出於以下原因:
- 雙向綁定(Two-Way Binding):使用Bind時,不僅可以從資料來源擷取值顯示在控制項中,還可以將控制項的值變更後更新回資料來源。 這種雙向綁定對於GridView的編輯、更新和插入操作非常有用,因為它可以簡化與資料來源的互動。
- 類型安全性(Type-Safe):Bind在綁定資料時會檢查資料類型,並盡可能將資料類型配對到控制項。 這樣可以減少資料類型轉換錯誤的可能性。
- 效能最佳化:Bind可能會比Eval更有效率,因為它可以在資料綁定過程中進行一些最佳化,例如延遲載入和類型推斷。
雖然預設使用Bind可能會為某些情況帶來便利性和效能優勢,但在某些情況下可能更適合使用Eval。 如果您只是需要從資料來源中檢索值並顯示在GridView中,而不需要將值變更後更新回資料來源,那麼使用Eval可能會更簡單和直覺。
如果您希望在GridView的ItemTemplate中使用Eval而不是Bind,您可以手動變更程式碼,將Text屬性從<%# Bind("cname") %>變更為<%# Eval("cname") %>。
********************************************************************************
ASP.NET WebForm, FormView 的 ItemTemplate 中,Label 為何預設使用 Bind,而非用 Eval ?
<ItemTemplate>
cname:<asp:Label ID="cnameLabel" runat="server" Text='<%# Bind("cname") %>' />
</ItemTemplate>
ChatGPT
在ASP.NET WebForms中,FormView控制項的ItemTemplate中預設使用Bind而不是Eval,可能是因為FormView通常用於資料編輯和顯示的情況,而不僅僅是顯示資料。 使用Bind提供了更強大的雙向資料綁定功能,適用於FormView控制項的編輯、更新和插入操作。
透過使用Bind,您可以實現以下功能:
- 雙向綁定:可以將控制項的值與資料來源進行雙向綁定,使得當使用者變更控制項的值時,可以將變更後的值自動更新到資料來源中。
- 類型安全性:Bind在綁定資料時會盡可能地將資料類型配對到控制項中,這可以減少資料類型轉換錯誤的可能性。
- 資料來源更新:當使用者對控制項進行變更並提交表單時,使用Bind可以使表單中的值自動更新到資料來源中,而無需手動編寫更新邏輯。
雖然預設使用Bind可能會為某些情況帶來便利性和效能優勢,但在某些情況下可能更適合使用Eval。 如果您只是需要從資料來源中檢索值並顯示在FormView中,而不需要將值變更後更新回資料來源,那麼使用Eval可能會更簡單和直覺。
如果您希望在FormView的ItemTemplate中使用Eval而不是Bind,您可以手動變更程式碼,將Text屬性從<%# Bind("cname") %>變更為<%# Eval("cname") %>。
********************************************************************************
Label 是唯讀的,Bind 的雙向綁定應該無用吧 ?
ChatGPT
您是對的,對於唯讀的Label控件,使用Bind進行雙向綁定是沒有意義的。 因為Label控制項是唯讀的,使用者無法在頁面上直接編輯它們,所以無法透過Label控制項向資料來源中傳遞使用者輸入的值。
在FormView的ItemTemplate中,如果Label控制用於唯讀目的,則應該使用Eval而不是Bind。 Eval只會從資料來源中擷取值並顯示在Label控制項中,而不會嘗試將值更新回資料來源。
因此,在只需要顯示資料而不需要更新資料的情況下,應該使用Eval而不是Bind。 如果您的Label控制項用於唯讀目的,可以將綁定從<%# Bind("cname") %>變更為<%# Eval("cname") %>,以確保最佳的效能和邏輯一致 性。
********************************************************************************
如果 FormView 提供編輯欄位 AAA,EditItemTemplate 和 InsertItemTemplate 對 AAA 欄位仍用 Bind,在 ItemTemplate 中,顯示欄位 AAA 的 Label 可從 Bind() 改用 Eval() 嗎?
ChatGPT
如果在 FormView 中,對於欄位 AAA 在 EditItemTemplate 和 InsertItemTemplate 中使用了 Bind(),那麼在 ItemTemplate 中使用 Eval() 通常是安全的,尤其是當您希望只讀地顯示欄位 AAA 的目前值時。
在 EditItemTemplate 和 InsertItemTemplate 中使用 Bind() 可以實現雙向綁定,使用戶能夠編輯欄位 AAA 並將變更儲存到資料來源中。 而在 ItemTemplate 中,您可能只是想顯示目前資料來源中欄位 AAA 的值,而不允許使用者直接編輯它。
所以,您可以將ItemTemplate 中顯示欄位AAA 的Label 控制項的綁定從<%# Bind("AAA") %> 變更為<%# Eval("AAA") %>,以便在顯示該值時不觸發 雙向綁定的邏輯。 這樣做不會影響編輯功能,因為 EditItemTemplate 和 InsertItemTemplate 仍然使用 Bind() 來處理編輯和插入操作。
********************************************************************************
Bind() 和 Eval() 哪個效能較好 ?
ChatGPT
在 ASP.NET WebForms 中,Eval() 和 Bind() 都是用於資料綁定的方法,但它們之間有一些不同之處,包括效能方面。
Eval():
- Eval() 用於從資料來源中檢索值並將其顯示在控制項中。
- 它是唯讀的,不會修改資料來源中的值。
- Eval() 在資料綁定時進行一次性的讀取操作,並將值直接綁定到控制項上,不涉及任何資料來源的變更。
- 由於 Eval() 是唯讀的,因此它的效能通常比較高,特別是在簡單資料綁定的情況下。
Bind():
- Bind() 除了從資料來源擷取值並將其顯示在控制項中之外,還可以將控制項中的值更新回資料來源中。
- Bind() 是雙向綁定的,可以用於在控制項中編輯值並將變更儲存到資料來源。
- Bind() 在資料綁定時會建立資料來源和控制項之間的雙向綁定關係,當使用者對控制項進行變更時,會自動更新資料來源中的值。
- 由於 Bind() 具有雙向綁定的功能,它可能會比 Eval() 更消耗效能,特別是在大規模資料綁定或編輯操作中。
因此,從效能角度來看,在只需要從資料來源中檢索值並顯示在控制項中時,Eval() 可能是更有效率的選擇。 但是,如果需要實現編輯和更新功能,並且可以使用雙向綁定,那麼 Bind() 可能是更合適的選擇,儘管在某些情況下可能會稍微影響效能。
********************************************************************************
結論:
GridView 和 FormView 的 ItemTemplate 中 Label 為何預設使用 Bind,而非用 Eval,不知道。
但實際測試,Label的 Bind()可以改成 Eval(),"編輯" 運作正常。
(完)
相關