简体   繁体   English

使用MySql在vb.net中自动完成文本框

[英]Autocomplete Textbox in vb.net using MySql

I am trying to make autocomplete function which starts suggesting from datatable when users types. 我正在尝试制作自动完成功能,当用户键入时,该功能将从数据表开始建议。 It seems all right but it pops up Not Found. 看来还可以,但它弹出“未找到”。 In my database all columns name and connections seems to be alright. 在我的数据库中,所有列的名称和连接似乎都没问题。 I don't understand where is the problem as it's even not throws any errors. 我不明白问题出在哪里,因为它甚至不会引发任何错误。 This is the link of files I uploaded on server 这是我在服务器上上传的文件的链接

ASPX ASPX

<link href="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.1/themes/base/jquery-ui.css" rel="stylesheet" type="text/css"/>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8.1/jquery-ui.min.js"></script> 
    <link href="jquery-ui.css" rel="stylesheet" type="text/css" />  
    <script src="http://ajax.aspnetcdn.com/ajax/jquery/jquery-1.8.0.js"></script>
    <script src="http://ajax.aspnetcdn.com/ajax/jquery.ui/1.8.22/jquery-ui.js"></script>


    <script type="text/javascript">  
        $(function () {
            $("#area").autocomplete({
                source: function (request, response) {
                    var param = { cityname: $('#area').val() };
                    $.ajax({
                        url: "Dafault.aspx/GetAreas",
                        data: JSON.stringify(param),
                        dataType: "json",
                        type: "POST",
                        contentType: "application/json; charset=utf-8",
                        dataFilter: function (data) { return data; },
                        success: function (data) {
                            response($.map(data.d, function (item) {
                                return {
                                    value: item
                                }
                            }))
                        },
                        error: function (XMLHttpRequest, textStatus, errorThrown) {
                            alert(errorThrown);
                        }
                    });
                },
                minLength: 2//minLength as 2, it means when ever user enter 2 character in TextBox the AutoComplete method will fire and get its source data. 
            });
        });

    </script>  

</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>

    <div class="form-items">
        Select Area<br />
        <asp:TextBox ID="area" CssClass="area" runat="server"></asp:TextBox>

    </div>

VB VB

Imports System.Data
Imports MySql.Data.MySqlClient
Imports System.Configuration
Imports System.Web.Services
Partial Class _Default
    Inherits System.Web.UI.Page
    <WebMethod>
    Public Shared Function GetAreas(areaname As String) As List(Of String)
        Dim area As New List(Of String)()
        Dim con As New MySqlConnection("Data Source=182.50.133.88;port=3306;Initial Catalog=db;User Id=user;password=pwd;")



        Dim query As String = String.Format("SELECT areaName FROM areas", areaname)
        'Note: you can configure Connection string in web.config also.
        Dim cmd As New MySqlCommand(query, con)
        con.Open()
        Dim reader As MySqlDataReader = cmd.ExecuteReader()
        While reader.Read()
            area.Add(reader.GetString(0))
        End While
        Return area
    End Function
End Class

Your WebMethod expects parameter with same name which you have passed from ajax . 您的WebMethod期望使用与您从ajax传递的名称相同的parameter

Change your param in javascript like this. 像这样更改您在javascriptparam

var param = { areaname : $('#area').val() };

Also you are using asp:Textbox which might change its id then it will not be found by jquery. 另外,您正在使用asp:Textbox ,它可能会更改其ID,然后jquery将找不到它。

So you can use ClientIDMode=static so id of textbox will not be changed. 因此,您可以使用ClientIDMode=static以便不会更改文本框的ID。

<asp:TextBox ID="area" CssClass="area" runat="server" ClientIDMode="Static"></asp:TextBox>

Update 更新

Your query doesn't have a where clause so you are getting all records from database. 您的查询没有where子句,因此您将从数据库获取所有记录。 Add a where clause and pass the areaname as parameter to query. 添加一个where子句,并将areaname作为parameter传递给查询。

Dim query As String = String.Format("SELECT areaName FROM areas Where UPPER(areaName) like @areaName", areaname);
Dim cmd As New MySqlCommand(query, con)
cmd.Parameters.Add("@areaName",areaname.ToUpper()+"%");

Update 2 更新2

You can also check if the area name starts with the letter you have passed then add to list otherwise don't add in list. 您还可以检查区域名称是否以您传递的字母开头,然后添加到列表中,否则不添加到列表中。

if(reader.GetString(0).StartsWith(areaname))
area.Add(reader.GetString(0))

I don't know exact syntax of VB but i hope you will get the idea. 我不知道VB的确切语法,但希望您能理解。

If you have only 1 letter that need to match with the suggestion, you can try this: 如果只有1个字母需要与建议匹配,则可以尝试以下操作:

    While reader.Read()
        Dim str As String=reader.GetString(0)
        If str(0)= areaname then area.Add(str)
    End While

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM