搜索功能在 .aspx 文件中不起作用

Search function not working in .aspx file

提问人:meraki_1 提问时间:5/18/2023 更新时间:5/20/2023 访问量:43

问:

我有一个名为 Narudzbe.aspx 的网页,它显示订单的 GridView。我正在尝试实现一种搜索功能,用户可以在其中输入特定的订单号并检索相应的订单。但是,搜索功能似乎没有按预期工作。

下面是相关代码:

Narudzbe.aspx

<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="Narudzbe.aspx.vb" Inherits="Mišković_OMIS_projekt.Narudzbe" %>

<!DOCTYPE html>
<!-- Rest of the HTML code -->

<form id="form2" runat="server">
    <!-- Rest of the form code -->
    <div class="search">
        <input type="text" id="txtSearch" placeholder="Pretraži po broju narudžbe"/>
        <input type="button" id="btnSearch" value="Pretraži" onclick="btnSearch_Click"/>
        <!-- Rest of the code -->
    </div>
</form>

纳鲁兹贝.aspx.vb

Imports System.Data.SqlClient

Partial Class Narudzbe
    Inherits System.Web.UI.Page

    Protected WithEvents btnSearch As Button
    Protected WithEvents txtSearch As TextBox

    Protected Sub btnSearch_Click(sender As Object, e As EventArgs) Handles btnSearch.Click
        Dim searchValue As String = txtSearch.Text.Trim()

        If Not String.IsNullOrEmpty(searchValue) Then
            SqlDataSource1.SelectCommand = "SELECT Narudžba.[ID narudžbe], Kupac.Ime, Narudžba.[Datum primitka], Narudžba.[Datum isporuke], Status.[Naziv statusa] FROM Narudžba INNER JOIN Kupac ON Narudžba.[ID kupac] = Kupac.[ID kupac] INNER JOIN Status ON Narudžba.[ID statusa] = Status.[ID statusa] WHERE [ID narudžbe] = @SearchValue"
            SqlDataSource1.SelectParameters.Clear()
            SqlDataSource1.SelectParameters.Add("SearchValue", searchValue)
        Else
            SqlDataSource1.SelectCommand = "PodaciZaTablicuNarudzbe"
            SqlDataSource1.SelectParameters.Clear()
        End If

        GridView1.DataBind()
    End Sub
End Class

我面临的问题是,当我在搜索输入字段中输入特定订单号并单击“Pretraži”按钮时,GridView 不会更新以显示过滤后的结果。似乎未触发 btnSearch_Click 事件处理程序或未正确执行 SQL 查询。

我已经仔细检查了代码,并确保按钮和文本框具有正确的 ID。可能导致此问题的原因是什么?关于如何修复搜索功能的任何建议?

注意:我将 Visual Studio 和 SQL Server 用于此 Web 应用程序。

提前感谢您的帮助!

HTML asp.net vb.net

评论

0赞 David 5/18/2023
调试时,单击按钮是否会发布表单?在WebForms中,我希望按钮是一个或至少有一个(就像现在一样)。asp:Buttonrunat="server"<form>
1赞 Albert D. Kallal 5/18/2023
为什么以及如何在此处更改表单 ID?当我创建一个 Web 表单页面时,以及我创建的最后无数个页面,然后标记显示表单 id=“form1”。在您的示例代码中,它到底是如何更改的,为什么会更改?您永远不必更改给定的默认值的 ID。我看了 20 年的书籍、文章、样本,没有一个改变过那个 id?对于此更改如何进入您的代码,是否有一些惊天动地的原因?(提示:不要更改该 ID,除非它是我们所知道的世界末日)。此外,页面上只能有一个这样的表单标签
0赞 meraki_1 5/18/2023
@AlbertD.Kallal谢谢。我将表单 ID 更改为“form1”,但我仍然收到相同的错误。
0赞 Albert D. Kallal 5/18/2023
请参阅我下面的帖子,我的意思是,您将经常并且应该更改您放入表单中的控件的“id”,但表单 id 标签不是这些常见用例之一。
0赞 Albert D. Kallal 5/19/2023
请参阅我的第二次编辑 - 我展示了一个工作搜索示例。

答:

3赞 Albert D. Kallal 5/18/2023 #1

有几件事:

当我创建 asp.net Web 表单页面时,

我明白了:

<form id="form1" runat="server">

    <div>

    </div>


</form>

因此,默认名称为 form1。自过去 20 年以来的书籍、示例代码以及当您创建新页面时,表单标记默认为 form1。你有什么特别的原因要改变它吗?(这样做可能是有原因的,但我想不出一个好的理由。但是,由于您要更改该表单标记 ID,因此您需要有充分的理由这样做)。

接下来:

当我从工具箱中拖放一个按钮时,我得到这个:

        <asp:Button ID="Button1" runat="server" Text="Button" />

再:

有没有一个巨大的、伟大的、梦幻般的惊天动地的想法,为什么你不在这里使用 asp.net 按钮?

因此,您可以插入 HTML 按钮,但要小心,因为 onclick=“要运行的客户端 java 脚本代码”

换言之,对于 HTML 按钮,您需要:

a) 选择控件的一个很好的理由 - 不仅仅是随机将泥浆扔到墙上,并希望在翅膀上祈祷按钮起作用。

b) 您希望按钮单击以运行 JavaScript(客户端浏览器端代码)运行 onclick=“my java script function here”。

所以,完全不清楚为什么要在这里拖放 HTML 按钮?

因此,对于 HTML 按钮,您可以拥有以下内容:

        <input id="Button2" type="button" value="button"
            onclick="myclientcode()"
            
            />

        <script>
            function myclientcode() {
                alert("This is client side click")
            }
        </script>

但是,如果您想要代码隐藏和服务器端事件,则将 + 拖放到 asp.net 按钮中,然后简单地双击该按钮以创建代码隐藏事件。

例如:

enter image description here

你也可以在查看标记时这样做,比如说:

enter image description here

我想,如果你喜欢世界贫困,第三种方法是用手输入标记,但话又说回来,我不希望你因为不得不用手输入这些东西而饿死。您可以(并且肯定会)在拖放该按钮或控件后经常调整生成的标记,并且经常会说将 button1 更改为一个好听的名字,例如 cmdEdit 等。

但是,就我的第一点而言?否,您不想更改 form1 的默认表单 ID 标记。(一个很好的理由是,SUPER RARE必须在代码中使用form1“id”,并且由于99%的时间您永远不会在代码中使用表单ID标签,因此您不需要更改表单ID标签。

但是,对于控制?为什么你当然会经常在代码后面使用这些控件和按钮,因此你经常并且应该根据自己的喜好更改这些控件的 ID。

所以请记住;

 for HTML button, onclick="run client side java script code"
 for asp.net button, onclick="run server side code behind"

编辑:工作搜索示例

所以,现在我们处理了所有这些问题,让我们尝试一个搜索功能。我们将搜索酒店名称,然后在网格视图中显示结果。

因此,我们的简单标记:

        <asp:Label ID="Label1" runat="server" Text="Enter Hotel" Font-Size="Large"></asp:Label>
        <asp:TextBox ID="txtHotel" runat="server" Font-Size="Large" Style="margin-left:20px"></asp:TextBox>
        <asp:Button ID="cmdSearch" runat="server" Text="Search" Style="margin-left:20px" CssClass="btn" />

        <br />
        <br />

        <asp:GridView ID="GridView1" runat="server" CssClass="table table-striped">

        </asp:GridView>

而我们的代码隐藏 - 注意我们不需要那些带有事件的代码 - 同样不清楚你为什么要添加/使用它们。

因此,背后的代码是这样的:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    If Not IsPostBack Then
        ' optional  - load grid with all data 
        LoadGrid()
    End If

End Sub

Sub LoadGrid()

    Dim strSQL As String =
        "SELECT * FROM vHotels WHERE HotelName like @Hotel + '%' 
         ORDER BY FirstName"
    Dim cmdSQL As New SqlCommand(strSQL)
    cmdSQL.Parameters.Add("@Hotel", SqlDbType.NVarChar).Value = txtHotel.Text

    GridView1.DataSource = MyRstP(cmdSQL)
    GridView1.DataBind

End Sub

Public Function MyRstP(cmdSQL As SqlCommand) As DataTable

    Dim rstData As New DataTable
    Using conn As New SqlConnection(My.Settings.TEST4)
        Using cmdSQL
            cmdSQL.Connection = conn
            conn.Open()
            rstData.Load(cmdSQL.ExecuteReader)
        End Using
    End Using

    Return rstData

End Function

结果是这样的:

enter image description here