2016-03-22 14 views
1

オートコンプリートテキストボックスを使用して、Oracleデータベース(改善)

public class PopulateProduct 
    { 
     public string ProductDesc { get; set; } 
     public decimal UnitPrice { get; set; } 
    } 

    Dictionary<string, PopulateProduct> dict = new Dictionary<string, PopulateProduct>(); 

    public void load() 
    { 
     string connstr = "user id=rawpic;password=admin"; 
     string cmdtxt = @"select PRODUCT_ID,DESCRIPTION,UNIT_PRICE 
           from products"; 

     AutoCompleteStringCollection autocom = new AutoCompleteStringCollection(); 
     TB_PRODUCT_ID.AutoCompleteMode = AutoCompleteMode.Suggest; 
     TB_PRODUCT_ID.AutoCompleteSource = AutoCompleteSource.CustomSource; 
     TB_PRODUCT_ID.AutoCompleteCustomSource = autocom; 

     using (OracleConnection conn = new OracleConnection(connstr)) 
     using (OracleCommand cmd = new OracleCommand(cmdtxt, conn)) 
     { 
      try 
      { 
       conn.Open(); 
       OracleDataReader dr = cmd.ExecuteReader(); 

       while (dr.Read()) 
       { 
        dict.Add((string)dr["PRODUCT_ID"], 
         new PopulateProduct() 
         { 
          ProductDesc = (string)dr["DESCRIPTION"], 
          UnitPrice = (decimal)dr["UNIT_PRICE"] 
         }); 
        autocom.Add(dr["PRODUCT_ID"].ToString()); 
       } 

      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message,"",MessageBoxButtons.OK,MessageBoxIcon.Error); 
      } 
     } 
    } 


    private void TB_PRODUCT_ID_TextChanged(object sender, EventArgs e) 
    { 
     if (dict.ContainsKey(TB_PRODUCT_ID.Text)) 
     { 
      TB_PRODUCTS_DESC.Text = dict[TB_PRODUCT_ID.Text].ProductDesc; 
      TB_UNIT_PRICE.Text = dict[TB_PRODUCT_ID.Text].UnitPrice.ToString(); 
     } 
    } 

を更新------ -------

私は以下の旧スクリプト以下のコードを使用して自動完成textbox値のデータ は自動的に別の2つの値を変更しますtextboxs 商品の説明a nd価格下のコードは正常に動作しますが、 の説明textboxの値が正しいとは限りません。最後のデータベースレコードの値を取得します。

最後に、自動完了を行うより速い方法がありますか?

ノートでは、それがユーザーの後に起こることがあり、製品IDですぐに説明と価格textbox同期を更新する必要がないことも可能と速い場合に選択のように製品ID を選択する方法を

private void TB_PRODUCT_ID_TextChanged(object sender, EventArgs e) 
    { 
     string connstr = "user id=rawpic;password=admin"; 
     string cmdtxt = @"select PRODUCT_ID,DESCRIPTION,UNIT_PRICE 
           from products"; 

     AutoCompleteStringCollection autocom = new AutoCompleteStringCollection(); 
     TB_PRODUCT_ID.AutoCompleteMode = AutoCompleteMode.Suggest; 
     TB_PRODUCT_ID.AutoCompleteSource = AutoCompleteSource.CustomSource; 
     TB_PRODUCT_ID.AutoCompleteCustomSource = autocom; 

     using (OracleConnection conn = new OracleConnection(connstr)) 
     using (OracleCommand cmd = new OracleCommand(cmdtxt, conn)) 
     { 
      try 
      { 
       conn.Open(); 
       OracleDataReader dr = cmd.ExecuteReader(); 
       while (dr.Read()) 
       { 
        autocom.Add(dr["PRODUCT_ID"].ToString()); 
        TB_PRODUCTS_DESC.Text = dr["DESCRIPTION"].ToString(); 
       } 
      } 
      catch(Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 
    } 

教えてください私は一部、以下のように、SELECT文のためのパラメータを追加して疲れていたが、それは文句を言わないあなただけのクエリのPRODUCT_ID結果からリストを移入している

 private void TB_PRODUCT_ID_TextChanged(object sender, EventArgs e) 
    { 
     string connstr = "user id=rawpic;password=admin"; 
     string cmdtxt = @"select PRODUCT_ID,DESCRIPTION,UNIT_PRICE 
           from products 
          where PRODUCT_ID=:PRODUCTID"; 

     AutoCompleteStringCollection autocom = new AutoCompleteStringCollection(); 
     TB_PRODUCT_ID.AutoCompleteMode = AutoCompleteMode.Suggest; 
     TB_PRODUCT_ID.AutoCompleteSource = AutoCompleteSource.CustomSource; 
     TB_PRODUCT_ID.AutoCompleteCustomSource = autocom; 

     using (OracleConnection conn = new OracleConnection(connstr)) 
     using (OracleCommand cmd = new OracleCommand(cmdtxt, conn)) 
     { 
      try 
      { 
       conn.Open(); 
       OracleDataReader dr = cmd.ExecuteReader(); 
       while (dr.Read()) 
       { 
        autocom.Add(dr["PRODUCT_ID"].ToString()); 
        cmd.Parameters.Add(new OracleParameter("PRODUCTID", TB_PRODUCT_ID.Text)); 
        TB_PRODUCTS_DESC.Text = dr["DESCRIPTION"].ToString(); 
       } 
      } 
      catch(Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
      } 
     } 
    } 
+0

最初のクエリにはWHERE句がないため、正しく動作しません。あなたの2番目のクエリは行いますが、なぜそれがうまくいかないのかを教えてくれません。詳細をお知らせください。 –

+0

AutoCompleteStringCollectionを使用すると、いつでも再クエリーする必要はありません!すべての単語でコレクションを初期化するだけで、.Netはユーザーの入力時に提案のフィルタリングを処理します。これは、あなたのスピードの問題がなくなるはずです... – SlimsGhost

答えて

1

をうまく。最初のコードブロックの例では、AutoCompleteStringCollectionを更新していますが、ループ内の最後の項目が含まれている静的テキストボックスを上書きしているだけです。

また、テキストが変更されるたびにこの重いコードを実行しています。これは本当に遅いものでなければなりません。

2つ目の例は、項目をパラメータコレクションに入れても、ループが完了したときに処分されている使用ブロック内にあるので機能しません(このようにパラメータを使用することはありません)。

1つの提案は、タイプの辞書を作成してループ内に記入することです。あなたのテキストボックスが変わったら、Dictionary [PRODUCT_ID] .Descriptionと.Priceを使うことができます。これは毎回データベースに戻ることがないのでアプリケーションの実行速度を向上させます。

public class MyObject { 
    string Description {get;set;} 
    decimal UnitPrice {get;set;} 
} 

public Dictionary<string, MyObject> _dict = new Dictionary<string, MyObject>(); 

public void Load() 
{ 
    string connstr = "user id=rawpic;password=admin"; 
    string cmdtxt = @"select PRODUCT_ID,DESCRIPTION,UNIT_PRICE from products"; 

    AutoCompleteStringCollection autocom = new AutoCompleteStringCollection(); 
    TB_PRODUCT_ID.AutoCompleteMode = AutoCompleteMode.Suggest; 
    TB_PRODUCT_ID.AutoCompleteSource = AutoCompleteSource.CustomSource; 
    TB_PRODUCT_ID.AutoCompleteCustomSource = autocom;  

    using (OracleConnection conn = new OracleConnection(connstr)) 
    using (OracleCommand cmd = new OracleCommand(cmdtxt, conn)) 
    { 
     try 
     { 
      conn.Open(); 
      OracleDataReader dr = cmd.ExecuteReader(); 
      while (dr.Read()) 
      { 
       _dict.Add(dr["PRODUCT_ID"], new MyObject() { Description = dr["DESCRIPTION"], UnitPrice = dr["UNIT_PRICE"] }; 
       autocom.Add(dr["PRODUCT_ID"].ToString()); 
      } 
     } 
     catch(Exception ex) 
     { 
      // handle exception 
     } 
    } 
} 

private void TB_PRODUCT_ID_TextChanged(object sender, EventArgs e) 
{ 

if (_dict.ContainsKey(TB_PRODUCT_ID.Text)) 
    { 
     TB_PRODUCTS_KEY.Text = _dict[TB_PRODUCT_ID.Text].Description; 
     TB_UNIT_PRICE.Text = _dict[TB_PRODUCT_ID.Text].UnitPrice.ToString(); 
    } 
} 

私が言うように、これを達成するための1つの方法は、他のコードを見ずに、その最良の方法を伝えることです。

+0

非常に有用なリプレイとあなたの説明のおかげで...私はあなたの提案を読んで試しましたが、その行に_dict.Add(dr ["PRODUCT_ID"])新しいオブジェクト(){ProductDesc = dr ["DESCRIPTION"]、UnitPrice = dr ["UNIT_PRICE"]}; ' – samer

+0

' System.Collections.Generic.Dictionary の最適オーバーロードされたメソッドが一致します。 Add(string、MyProject.Form.Object) 'に無効な引数がいくつかあります 引数1:'オブジェクト 'から'文字列 'に変換できません ' MyProject.Form1.Object。ProductDesc 'が保護レベルのためにアクセスできない ' MyProject.Form1.Object.UnitPrice 'が保護レベル\tのためアクセスできません....私はインターネット上でレビューした間違ったセクションでクラスを定義しているため、これらのエラーが考えられます約C#は新しいクラスを定義しますか?名前空間の後ろに定義されていますが、Dictionaryキーワード – samer

+0

を使用することができませんでした。フォームクラス内にクラスを配置し、すべてのコードが正常に動作します。エラーを除いて....私はまた、私はそれらを解決しようとしましたが、私はあなたの助けをしてください – samer

関連する問題