提问人:Demetrius Rhodes 提问时间:9/26/2023 最后编辑:codeandcloudDemetrius Rhodes 更新时间:9/27/2023 访问量:41
使用 JQuery 将 Click 事件添加到 GridView 中的 TextBox
Add Click Event to TextBox in GridView Using JQuery
问:
我正在尝试访问我的文本框并添加单击事件。我在文本框之外添加了一个单击事件,使用 .Gridview
Gridview
jQuery
<asp:TextBox ID = "dcrTxtBoxAll" runat="server"
style="Z-INDEX: 120; LEFT: 783px; POSITION: absolute; TOP: 111px; width: 432px; height: 71px;"
ClientIDMode="Static"
Text='<%# Bind("Description") %>'
Visible="false"
TextMode="MultiLine">
</asp:TextBox>
Javascript的
<script type="text/javascript" src="jquery-3.7.1.js"></script>
<script type="text/javascript">
// This function adds a click listener to the dcrTxrBoxAll textbox. When the textbox is clicked the update button and the GridView Rows textboxes are disabled
$("#dcrTxtBoxAll").on('click', function()
{
$("#cmdUpdate").val('Update All'); // Changed the button text
// Loop through the GridView and disable each text box
$("#GridView1 tr").each(function ()
{
var $this = $(this);
var $dcrTextBox = $("#dcrTextBox", $this); // Get the textbox at each row
$dcrTextBox.prop("disabled", true); // Disable the textbox
});
$("*").unbind("click"); // Removes all click handlers added by javascript from every element
$("[onclick]").removeAttr("onclick"); // Finds all elements with an 'onclick' attribute, and removes that attribute
});
</script>
我尝试了类似的方法,但我无法让它工作。
这是:GridView
<asp:GridView ID="GridView1"
runat="server"
style="Z-INDEX: 120; LEFT: 410px; POSITION: absolute; TOP: 244px; width: 698px; height: 251px;"
BackColor="DeepSkyBlue"
AutoGenerateColumns="False"
BorderStyle="Solid"
BorderColor="Black"
AllowSorting="True"
PageSize="15"
AllowMultiRowSelection="true"
ShowHeaderWhenEmpty="true"
GridLines="None">
<RowStyle backcolor="White" />
<SelectedRowStyle BackColor="Yellow" />
<Columns>
<asp:TemplateField>
<HeaderTemplate>
<asp:CheckBox ID="ChkHeader"
runat="server"
AutoPostBack="true"
OnCheckedChanged="ChkHeader_CheckedChanged" />
</HeaderTemplate>
<ItemTemplate>
<asp:CheckBox ID="ChkEmpty"
runat="server"
AutoPostBack="true"
OnCheckedChanged="ChkEmpty_CheckedChanged" />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="RequestorId"
HeaderText="Requestor Id"
ReadOnly="True">
</asp:BoundField>
<asp:BoundField DataField="FileName"
HeaderText="File Name"
ReadOnly="True">
</asp:BoundField>
<asp:BoundField DataField="FolderName"
HeaderText="Sub Folder Name"
ReadOnly="True">
<HeaderStyle HorizontalAlign="Center"
Width="24px"
VerticalAlign="Middle"></HeaderStyle>
<ItemStyle HorizontalAlign="Center"></ItemStyle>
</asp:BoundField>
<asp:BoundField DataField="ModifiedDt"
HeaderText="Uploaded Dt"
ReadOnly="True">
<HeaderStyle HorizontalAlign="Center"
Width="48px"></HeaderStyle>
<ItemStyle HorizontalAlign="Center"></ItemStyle>
<HeaderStyle HorizontalAlign="Center"
Width="96px" />
<ItemStyle HorizontalAlign="Left" />
</asp:BoundField>
<asp:TemplateField HeaderText="Description of Change/Reason"
ItemStyle-Width="300px">
<ItemTemplate>
<asp:Label ID="dcrLabel"
runat="server"
Text='<%# Bind("Description") %>'></asp:Label>
<asp:TextBox ID="dcrTextBox"
runat="server"
ClientIDMode="Static"
Text='<%# Bind("Description") %>'
Visible="false"
TextMode="MultiLine"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
这是我尝试访问中的文本框的内容。我似乎无法让它注册点击。GridView
<script type="text/javascript">
$('#dcrTextBox').on('click', function() {
alert('Hello');
});
</script>`
答:
好吧,该文本框 ID 是“dcrTextBox”。
但是,由于它在 GridView 中重复了很多次,那么上面的 TextBox 将引用哪一行和哪个实例?
请记住,HTML 标准是不允许在同一页面上使用相同 ID 的控件。因此,如果您有 10 行,那么您将在标记中看到 10 行,并且该行上的每个控件都将具有自己自动生成的 ID。
但是,当将控件、文本框或几乎任何控件拖放到网页中时?
为什么要使用jQuery将某些事件连接到控件?我认为没有真正的理由这样做,现在你有更难阅读的标记,因为你有一个按钮,或者像文本框一样的控件,现在在该页面的标记中的其他一些地方,你必须知道,必须找到,必须寻找连接该事件的jQuery。因此,对于按钮或文本框,在大多数情况下,最好只将事件添加到控件中。
因此,当开发人员查看该控件时,您可以看到某个事件附加到该控件。因此,您不必在页面上的其他地方查找即可知道/查看/发现某些jQuery代码现在决定将某些事件连接到该控件。这增加了开发人员的上下文和脑力劳动量,并使调试此类页面变得相当困难。
要100%清楚?jQuery能够在页面上附加和连接控件事件,并针对许多控件执行此操作,这是jQuery的一个非常出色的功能。因此,我强烈建议使用 jQuery 选择器来连接页面上的事件。
但是,如果不需要选择多个控件并将事件连接到这些控件的功能,则只需使用给定控件标记中定义的常规纯 Jane 事件。
为文本框定义单击事件的几个额外结果之一是,我们可以自由地使用给定的单击事件传递其他参数。
所以,我们可以这样说:
<asp:TemplateField HeaderText="Description">
<ItemTemplate>
<asp:TextBox ID="txtDesc" runat="server"
TextMode="MultiLine"
Text='<%# Eval("Description") %>'
onclick='<%# $"myrowclick(this,{Eval("ID")},{Container.DataItemIndex});return false" %>'
>
</asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
因此,在上面,我们传递了控件“this”,我们传递了数据库行 PK id,我们传递了行索引。
因此,上面的标记是 GridView 的一部分,如下所示:
<asp:GridView ID="GVHotels" runat="server" AutoGenerateColumns="False"
DataKeyNames="ID" CssClass="table table-hover"
Width="55%"
>
<Columns>
<asp:BoundField DataField="FirstName" HeaderText="FirstName" />
<asp:BoundField DataField="LastName" HeaderText="LastName" />
<asp:BoundField DataField="City" HeaderText="City" />
<asp:BoundField DataField="HotelName" HeaderText="Hotel" />
<asp:TemplateField HeaderText="Description">
<ItemTemplate>
<asp:TextBox ID="txtDesc" runat="server"
TextMode="MultiLine"
Text='<%# Eval("Description") %>'
onclick='<%# $"myrowclick(this,{Eval("ID")},{Container.DataItemIndex});return false" %>'
>
</asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Bookings">
<ItemTemplate>
<asp:Button ID="cmdView" runat="server" Text="Bookings"
class="btn myshadow"
OnClientClick="return callme(this)"
OnClick="cmdView_Click" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
要加载的代码隐藏:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
LoadGrid
End If
End Sub
Sub LoadGrid()
GVHotels.DataSource = MyRst("SELECT * FROM tblHotelsA
WHERE ID IN (select Hotel_id FROM BOOKINGS)
ORDER BY HotelName")
GVHotels.DataBind()
End Sub
我们现在有这个结果:
因此,由于 GridView 控件“重复”了该文本框,因此不妨在标记中添加一次单击事件。如上所示,这具有传递数据库 PK ID、行索引等值的额外优势,当然还有对传递的控件使用“this”。
评论