2

私は兄の店でユーザー向けのC#アプリケーションを作成しています。

販売されたすべてのアイテムを格納するSQLServerデータベースがあります。アイテムはアプリケーションから追加されます。

ユーザーがアプリケーションの「CustomerName」フィールドにテキストを入力したら、DB呼び出しを実行して、同じ顧客名(またはこれまでに入力した名前)の以前の売上を確認し、テキストボックスに名前が表示されます。

私が抱えている問題は、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; 
} 

安全策として、コンボボックスに入力されたテキストが少なくとも3文字であるかどうかを確認します

if(textBox1.Text.Length >= 3)
    textBox1.AutoCompleteCustomSource = GetCustomerInfo(textBox1.Text);
else
    textBox1.AutoCompleteCustomSource = null;
于 2012-06-01T23:34:21.353 に答える
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 に答える
0

まず、テキストボックスのこれらのプロパティを設定するか、フォームに書き込む必要があります。

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

次に、必要に応じて、ArrayList、String配列、またはList(または顧客名のIDが必要な場合は辞書)のインスタンスを作成できます。

または、AutoCompleteStringCollection-itを使用して、データを取得するための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 に答える