2

我正在为我的兄弟在他的商店中为用户创建一个 C# 应用程序。

我有一个存储所有已售商品的 SQL Server 数据库,这些商品是从应用程序中添加的。

当用户在应用程序的“客户名称”字段中输入文本时,我希望它进行数据库调用并检查具有相同客户名称(或迄今为止输入的名称)的任何先前销售并填写文本框将名称。

我遇到的问题是:如果有一个客户叫 John,另一个叫 Joe,我需要选择 John,如果我在框中输入 J,它只会选择 Joe,然后将文本光标返回到开头文本框相当烦人和不方便。

理想的解决方案是,如果我在文本框中键入 J,文本框正下方会出现一个下拉框,显示所有带有 J 的客户,允许用户选择一个客户,然后用值填写文本框。如果我然后键入 Jo,则 Jo 的所有记录将出现在下拉列表等中。

编码部分应该不是问题(希望如此),我只是想知道解决这个问题的最佳方法。

4

3 回答 3

2

首先在您的文本框中添加/更改这些属性

textBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend;
textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;

那么您可以使用此方法获取以您的前缀开头的客户名称列表。

public List<string> GetCustomerInfo(string custName)
{
    List<string> result = new List<string>();
    string sql = "Select Name from Customers Where Name like @partName";
    using(SqlConnection con = GetConnection())
    using(SqlCommand cmd = new SqlCommand(sql, con))
    {
         con.Open();
         cmd.Parameters.AddWithValue("@partName", custName + "%"); 
         using(SqlDataReader r = cmd.ExecuteReader())
         {
              while(r.Read()) 
              {
                  if(!r.IsDbNull(0)) 
                      result.Add(r.GetString(0)); 
              }
         }
    } 
    return result; 
} 

作为保障,我将检查您在组合框中输入的文本是否至少为三个字符

if(textBox1.Text.Length >= 3)
    textBox1.AutoCompleteCustomSource = GetCustomerInfo(textBox1.Text);
else
    textBox1.AutoCompleteCustomSource = null;
于 2012-06-01T23:34:21.353 回答
0

首先,您需要设置文本框的这些属性或将它们写入表单:

yourTextbox.AutoCompleteMode = AutoCompleteMode.Suggest;
yourTextBox.AutoCompleteSource = AutoCompleteSource.CustomSource;

然后您可以根据需要创建 ArrayList、String 数组或 List(或字典,如果您需要客户名称的 ID)的实例。

或者只是你可以使用AutoCompleteStringCollection- 它也是 C# 类实例中实现的字符串数组/集合来将数据检索到..

然后设置txtName.AutoCompleteCustomSource = yourListOfTheMatchedNames;

一个小例子给你一个想法:

void yourTextBox_TextChanged (object sender, EventArgs e)
{
   SqlDataReader dReader;
   SqlConnection conn = new SqlConnection();
   conn.ConnectionString = strConnection;
   SqlCommand cmd = new SqlCommand();
   cmd.Connection = conn;
   cmd.CommandType = CommandType.Text; //better is to use a stored proc or if you use a .NET 3.5 or higher framework then LinqtoSQL
   cmd.CommandText = "Select [yourNameColumn] from yourNameTable where yourNameColumn LIKE" + yourTextBox.Text +"%"; //before lines from this you can set them initializing code part of your form..it will be your choice
   conn.Open();
   dReader = cmd.ExecuteReader();
   if (dReader.HasRows == true)
   {
       yourListOfTheMatchedNames.Clear(); // to clear previous search..its optional to depends of your choice
       while (dReader.Read())
       {                  
              yourListOfTheMatchedNames.Add(dReader["Name"].ToString());    
       }
    }
    else
    {
        MessageBox.Show("There is No Customer Name Starts with You Typed");
    }
    dReader.Close();

    txtName.AutoCompleteMode = AutoCompleteMode.Suggest;
    txtName.AutoCompleteSource = AutoCompleteSource.CustomSource;
    txtName.AutoCompleteCustomSource = yourListOfTheMatchedNames;

}
于 2012-06-02T00:17:53.753 回答
0

最好的方法是使用 jQuery 对服务器端函数进行 AJAX 调用,以便为您进行查找。

考虑这个 C#

public string getNames(string prefix)
{
     //logic to perform your name retrieval from the SQL Server database based on the passed in string parameter: "prefix"
     return "John,Joe,Joseph";
}

jQuery :

$(document).ready(function(){
    //assign the getNames() function each time the key is 
    //pressed on the txtNames input
    $('#txtName').keyup(function(){
        getNames();
    });
});

function getNames(){
    $.ajax({
        type: 'POST',
        url: 'page-to-post-to.ashx',
        data: {
            prefix: 'J'
        },
        success: function(data){
            //data will return : 'John,Joe,Joseph'
            //use your javascript logic to separate these names by the comma delimiter
            //and use them!
        }
    });
}

HTML

<input id="txtName" />

这可能不是 100% 正确,但它至少应该让你走上正确的道路。

于 2012-06-01T23:30:24.037 回答