2024年2月26日 星期一

[研究]ASP.NET WebForm, ListView, GridView 的 ItemTemplate 中,Label的 Bind()可以改成 Eval() 嗎?

[研究]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="更新" />
                &nbsp;<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="插入" />
                &nbsp;<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="編輯" />
                &nbsp;<asp:LinkButton ID="DeleteButton" runat="server" CausesValidation="False" CommandName="Delete" Text="刪除" />
                &nbsp;<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(),"編輯" 運作正常。 

(完)

相關

沒有留言:

張貼留言