[研究][ASP.NET]Select2 v4.0.3 讓 HTML select 與 ASP.NET DropDownList 等下拉選單可以輸入關鍵字,即時過濾顯示下拉選項
2022-05-09
環境:Visual Studio 2022 + ASP.NET + WebForm + Web Application + C#
********************************************************************************
若 DropDownList 沒有在任何 Control ( GridView, FormView, DetailsView ..) 之中,也不在 Master Page 中
Default.aspx
<%@ Page Language="C#" AutoEventWireup="true"
CodeBehind="Default.aspx.cs" Inherits="WebApplication1.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>
<link href="Content/css/select2.css" rel="stylesheet" />
<%--jQuery.js 必須在 select.js 之前--%>
<script src="Scripts/jquery-3.6.0.js"></script>
<script src="Scripts/select2.js"></script>
<%--利用 class 或 CssClass 使用 select2 方式--%>
<script type="text/javascript">
$(document).ready(function () {
$(".Select2Class").select2();
});
</script>
<%--利用 id 使用 select2 方式--%>
<script type="text/javascript">
$(function () {
$("[id$='DropDownList2']").select2();
});
</script>
<%--利用 ClientID 使用 select2 方式--%>
<script type="text/javascript">
$(function () {
$("#<%= DropDownList3.ClientID %>").select2();
});
</script>
</head>
<body>
<form id="form1" runat="server">
<asp:DropDownList ID="DropDownList1" CssClass="Select2Class" runat="server">
<asp:ListItem></asp:ListItem>
<asp:ListItem>apple</asp:ListItem>
<asp:ListItem>banana</asp:ListItem>
<asp:ListItem>pineapple</asp:ListItem>
</asp:DropDownList>
<asp:DropDownList ID="DropDownList2" runat="server">
<asp:ListItem></asp:ListItem>
<asp:ListItem>apple</asp:ListItem>
<asp:ListItem>banana</asp:ListItem>
<asp:ListItem>pineapple</asp:ListItem>
</asp:DropDownList>
<asp:DropDownList ID="DropDownList3" runat="server">
<asp:ListItem></asp:ListItem>
<asp:ListItem>apple</asp:ListItem>
<asp:ListItem>banana</asp:ListItem>
<asp:ListItem>pineapple</asp:ListItem>
</asp:DropDownList>
<asp:DropDownList ID="DropDownList4" CssClass="Select2Class2" runat="server">
<asp:ListItem></asp:ListItem>
<asp:ListItem>apple</asp:ListItem>
<asp:ListItem>banana</asp:ListItem>
<asp:ListItem>pineapple</asp:ListItem>
</asp:DropDownList>
<asp:DropDownList ID="DropDownList5" runat="server">
<asp:ListItem></asp:ListItem>
<asp:ListItem>apple</asp:ListItem>
<asp:ListItem>banana</asp:ListItem>
<asp:ListItem>pineapple</asp:ListItem>
</asp:DropDownList>
<asp:DropDownList ID="DropDownList6" runat="server">
<asp:ListItem></asp:ListItem>
<asp:ListItem>apple</asp:ListItem>
<asp:ListItem>banana</asp:ListItem>
<asp:ListItem>pineapple</asp:ListItem>
</asp:DropDownList>
</form>
<%--select2 相關 JavaScript 寫在之後也可--%>
<script type="text/javascript">
$(document).ready(function () {
$(".Select2Class2").select2();
});
</script>
<script type="text/javascript">
$(function () {
$("[id$='DropDownList5']").select2();
});
</script>
<script type="text/javascript">
$(function () {
$("#<%= DropDownList6.ClientID %>").select2();
});
</script>
</body>
</html>
|
補:以100%寬度顯示,或其他寬度顯示
<script type="text/javascript"> $(document).ready(function () {
$(".Select2Class2").select2({width:"100%"});
});
|
執行結果
(下圖)輸入 ap,即時過濾僅顯示包含該字串的選項
HTML Source
|
********************************************************************************
若 DropDownList 在 Control ( GridView, FormView, DetailsView ..) 之中
例如包在 DetailsView1 中,則 DropDownList2 的 HTML Source 中 id 和 name 會變化,並非原來的 id="DropDownList2",且 id 和 name 會不一致,name 用 $,id 用 _
name="DetailsView1$DropDownList2"
id="DetailsView1_DropDownList2"
另外 ClientID 的方式無法使用。
**********
Default2.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default2.aspx.cs" Inherits="WebApplication1.Default2" %> <!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> <link href="Content/css/select2.css" rel="stylesheet" /> <%--jQuery.js 必須在 select.js 之前--%> <script src="Scripts/jquery-3.6.0.js"></script> <script src="Scripts/select2.js"></script> <%--利用 class 或 CssClass 使用 select2 方式--%> <script type="text/javascript"> $(document).ready(function () { $(".Select2Class").select2(); }); </script> <%--利用 id 使用 select2 方式--%> <script type="text/javascript"> $(function () { $("[id$='DropDownList2']").select2(); }); </script> <%--利用 ClientID 使用 select2 方式--%> <%--編譯錯誤 描述: 資源編譯無法完成 (錯誤發生於服務要求)。請檢閱下列的特定錯誤詳細資料,並視情況修改您的原始程式碼。 編譯器錯誤訊息: CS0103: The name 'DropDownList3' does not exist in the current context <script type="text/javascript"> $(function () { $("#<%= DropDownList3.ClientID %>").select2(); }); </script>--%> </head> <body> <form id="form1" runat="server"> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:TestDBConnectionString %>" DeleteCommand="DELETE FROM [Fruits] WHERE [SN] = @SN" InsertCommand="INSERT INTO [Fruits] ([FruitName]) VALUES (@FruitName)" SelectCommand="SELECT * FROM [Fruits]" UpdateCommand="UPDATE [Fruits] SET [FruitName] = @FruitName WHERE [SN] = @SN"> <DeleteParameters> <asp:Parameter Name="SN" Type="Int32" /> </DeleteParameters> <InsertParameters> <asp:Parameter Name="FruitName" Type="String" /> </InsertParameters> <UpdateParameters> <asp:Parameter Name="FruitName" Type="String" /> <asp:Parameter Name="SN" Type="Int32" /> </UpdateParameters> </asp:SqlDataSource> <asp:DetailsView ID="DetailsView1" runat="server" Height="50px" Width="600px" DefaultMode="Insert" AllowPaging="True" AutoGenerateRows="False" DataKeyNames="SN" DataSourceID="SqlDataSource1"> <Fields> <asp:BoundField DataField="SN" HeaderText="SN" InsertVisible="False" ReadOnly="True" SortExpression="SN" /> <asp:TemplateField HeaderText="FruitName" SortExpression="FruitName"> <EditItemTemplate> <asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("FruitName") %>'></asp:TextBox> </EditItemTemplate> <InsertItemTemplate> <%--<asp:TextBox ID="TextBox1" runat="server" Text='<%# Bind("FruitName") %>'></asp:TextBox>--%> <asp:DropDownList ID="DropDownList1" CssClass="Select2Class" runat="server"> <asp:ListItem></asp:ListItem> <asp:ListItem>apple</asp:ListItem> <asp:ListItem>banana</asp:ListItem> <asp:ListItem>pineapple</asp:ListItem> </asp:DropDownList> <asp:DropDownList ID="DropDownList2" runat="server"> <asp:ListItem></asp:ListItem> <asp:ListItem>apple</asp:ListItem> <asp:ListItem>banana</asp:ListItem> <asp:ListItem>pineapple</asp:ListItem> </asp:DropDownList> <asp:DropDownList ID="DropDownList3" runat="server"> <asp:ListItem></asp:ListItem> <asp:ListItem>apple</asp:ListItem> <asp:ListItem>banana</asp:ListItem> <asp:ListItem>pineapple</asp:ListItem> </asp:DropDownList> <asp:DropDownList ID="DropDownList4" CssClass="Select2Class2" runat="server"> <asp:ListItem></asp:ListItem> <asp:ListItem>apple</asp:ListItem> <asp:ListItem>banana</asp:ListItem> <asp:ListItem>pineapple</asp:ListItem> </asp:DropDownList> <asp:DropDownList ID="DropDownList5" runat="server"> <asp:ListItem></asp:ListItem> <asp:ListItem>apple</asp:ListItem> <asp:ListItem>banana</asp:ListItem> <asp:ListItem>pineapple</asp:ListItem> </asp:DropDownList> <asp:DropDownList ID="DropDownList6" runat="server"> <asp:ListItem></asp:ListItem> <asp:ListItem>apple</asp:ListItem> <asp:ListItem>banana</asp:ListItem> <asp:ListItem>pineapple</asp:ListItem> </asp:DropDownList> </InsertItemTemplate> <ItemTemplate> <asp:Label ID="Label1" runat="server" Text='<%# Bind("FruitName") %>'></asp:Label> </ItemTemplate> </asp:TemplateField> <asp:CommandField ShowDeleteButton="True" ShowEditButton="True" ShowInsertButton="True" /> </Fields> </asp:DetailsView> </form> <%--select2 相關 JavaScript 寫在之後也可--%> <script type="text/javascript"> $(document).ready(function () { $(".Select2Class2").select2(); }); </script> <script type="text/javascript"> $(function () { $("[id$='DropDownList5']").select2(); }); </script> <%--編譯錯誤 描述: 資源編譯無法完成 (錯誤發生於服務要求)。請檢閱下列的特定錯誤詳細資料,並視情況修改您的原始程式碼。 編譯器錯誤訊息: CS0103: The name 'DropDownList6' does not exist in the current context <script type="text/javascript"> $(function () { $("#<%= DropDownList6.ClientID %>").select2(); }); </script>--%> </body> </html> |
執行結果
HTML Source 內容
|
********************************************************************************
若 DropDownList 在 Master Page 的 Content Place Holder 中
Site1.Master
<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Site1.master.cs" Inherits="WebApplication1.Site1" %> <!DOCTYPE html> <html> <head runat="server"> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> <title></title> <link href="Content/css/select2.css" rel="stylesheet" /> <script src="Scripts/jquery-3.6.0.js"></script> <script src="Scripts/select2.js"></script> <%--利用 class 或 CssClass 使用 select2 方式--%> <script type="text/javascript"> $(document).ready(function () { $(".Select2Class").select2(); }); </script> <asp:ContentPlaceHolder ID="head" runat="server"> </asp:ContentPlaceHolder> </head> <body> <form id="form1" runat="server"> <div> <asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server"> </asp:ContentPlaceHolder> </div> </form> </body> </html> |
WebForm1.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/Site1.Master" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" %> <asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server"> <%--利用 class 或 CssClass 使用 select2 方式--%> <script type="text/javascript"> $(document).ready(function () { $(".Select2Class3").select2(); }); </script> <%--利用 id 使用 select2 方式--%> <script type="text/javascript"> $(function () { $("[id$='DropDownList2']").select2(); }); </script> <%--利用 ClientID 使用 select2 方式,會依據 ID 變化自動改名 --%> <script type="text/javascript"> $(function () { $("#<%= DropDownList3.ClientID %>").select2(); }); </script> <%--直接使用 HTML Source 看到的 ID--%> <script type="text/javascript"> $(function () { $("[id$='ContentPlaceHolder1_DropDownList4']").select2(); }); </script> <%--編譯錯誤 描述: 資源編譯無法完成 (錯誤發生於服務要求)。請檢閱下列的特定錯誤詳細資料,並視情況修改您的原始程式碼。 編譯器錯誤訊息: CS1056: Unexpected character '$' <script type="text/javascript"> $(function () { $("#<%= ctl00$ContentPlaceHolder1$DropDownList6A.ClientID %>").select2(); }); </script>--%> </asp:Content> <asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="server"> DropDownList1, 1A, 2, 3, 4<br /> <asp:DropDownList ID="DropDownList1" CssClass="Select2Class" runat="server"> <asp:ListItem></asp:ListItem> <asp:ListItem>apple</asp:ListItem> <asp:ListItem>banana</asp:ListItem> <asp:ListItem>pineapple</asp:ListItem> </asp:DropDownList> <asp:DropDownList ID="DropDownList1A" CssClass="Select2Class3" runat="server"> <asp:ListItem></asp:ListItem> <asp:ListItem>apple</asp:ListItem> <asp:ListItem>banana</asp:ListItem> <asp:ListItem>pineapple</asp:ListItem> </asp:DropDownList> <asp:DropDownList ID="DropDownList2" runat="server"> <asp:ListItem></asp:ListItem> <asp:ListItem>apple</asp:ListItem> <asp:ListItem>banana</asp:ListItem> <asp:ListItem>pineapple</asp:ListItem> </asp:DropDownList> <asp:DropDownList ID="DropDownList3" runat="server"> <asp:ListItem></asp:ListItem> <asp:ListItem>apple</asp:ListItem> <asp:ListItem>banana</asp:ListItem> <asp:ListItem>pineapple</asp:ListItem> </asp:DropDownList> <asp:DropDownList ID="DropDownList4" runat="server"> <asp:ListItem></asp:ListItem> <asp:ListItem>apple</asp:ListItem> <asp:ListItem>banana</asp:ListItem> <asp:ListItem>pineapple</asp:ListItem> </asp:DropDownList> <asp:DropDownList ID="DropDownList5" ClientIDMode="AutoID" runat="server"> <asp:ListItem></asp:ListItem> <asp:ListItem>apple</asp:ListItem> <asp:ListItem>banana</asp:ListItem> <asp:ListItem>pineapple</asp:ListItem> </asp:DropDownList> <asp:DropDownList ID="DropDownList6" ClientIDMode="Inherit" runat="server"> <asp:ListItem></asp:ListItem> <asp:ListItem>apple</asp:ListItem> <asp:ListItem>banana</asp:ListItem> <asp:ListItem>pineapple</asp:ListItem> </asp:DropDownList> <asp:DropDownList ID="DropDownList7" ClientIDMode="Predictable" runat="server"> <asp:ListItem></asp:ListItem> <asp:ListItem>apple</asp:ListItem> <asp:ListItem>banana</asp:ListItem> <asp:ListItem>pineapple</asp:ListItem> </asp:DropDownList> <asp:DropDownList ID="DropDownList8" ClientIDMode="Static" runat="server"> <asp:ListItem></asp:ListItem> <asp:ListItem>apple</asp:ListItem> <asp:ListItem>banana</asp:ListItem> <asp:ListItem>pineapple</asp:ListItem> </asp:DropDownList> </asp:Content> |
執行結果
HTML Source
|
********************************************************************************
Control.ClientID 屬性
Control.ClientID 屬性 (System.Web.UI) | Microsoft Docs
https://docs.microsoft.com/zh-tw/dotnet/api/system.web.ui.control.clientid?view=netframework-4.8
值 | 描述 |
---|---|
AutoID | ClientID 值是透過串連每個父命名容器的 ID 值與控制項的 ID 值產生。 在呈現控制項之多個執行個體的資料繫結情節中,遞增值會插入控制項之 ID 值的前面。 各區段是以底線字元 (_) 分隔。 此演算法用於早于 ASP.NET 4 的 ASP.NET 版本。 |
Static | ClientID 值設定為 ID 屬性的值。 如果控制項是命名容器,則對於其包含的所有控制項而言,會用來做為命名容器之階層架構的最上層。 |
Predictable | 這個演算法用於資料繫結控制項中的控制項。 ClientID 值是透過串連父命名容器的 ClientID 值與控制項的 ID 值產生。 如果控制項是資料繫結控制項,並且會產生多個資料列,則 ClientIDRowSuffix 屬性中指定之資料欄位的值會加入結尾處。 針對 GridView 控制項,可以指定多個資料欄位。 ClientIDRowSuffix如果屬性是空白的,則會在結尾加入序號,而不是資料欄值。 各區段是以底線字元 (_) 分隔。 |
Inherit | 此控制項會繼承其 ClientIDMode 控制項的 NamingContainer 設定。 |
頁面的 ClientIDMode 預設值為 Predictable 。 控制項的 ClientIDMode 預設值為 Inherit 。 因為控制項的預設值是 Inherit ,所以預設產生模式為 Predictable 。 不過, (如果您使用 Visual Studio 將 Web 專案轉換為舊版的 ASP.NET 4,Visual Studio會自動將網站預設值 AutoID 設定為 Web.config file.)
ASP.NET Web Server Control Identification | Microsoft Docs
https://docs.microsoft.com/zh-tw/previous-versions/1d04y8ss(v=vs.140)
********************************************************************************
使用 HTML 的 class 或 APS.NET Control 的 CssClass 用 style 方式來設定,可以避免 ID 變化的問題,不然就要使用 ClientIDMode="Static" 方式。
(完)
相關
[研究][ASP.NET]MasterPage中ContentPlaceHolder內的 JavaScript「顯示密碼」功能
[研究][ASP.NET]JavaScript 抓取 ContentPlaceHolder 中 ASP.NET 控制項的 ID
https://shaurong.blogspot.com/2022/04/aspnetmasterpagecontentplaceholder.html
沒有留言:
張貼留言