2016-05-27 9 views
0

私はフォームから詳細を取り込んでPDFファイルを作成する簡単な請求書作成アプリケーションを作成しています。データはSQL Serverデータベースに格納されます。なぜ私のコンボボックスデータバインディングは機能しませんか?

問題は、選択されたときに正しい顧客情報が表示されない項目のコンボボックスコントロールにあります。最初の項目は、データベース内の最後のレコードの詳細を表示し、その逆も同様です。問題の

コントロール:

enter image description here

Customerがテーブル:

IMSDBAccessがデータベースにクエリのを処理するためのクラスであるときに、フォームのロード、データバインディング

enter image description here

private void InvoiceDetails_Load(object sender, EventArgs e) 
    { 
     txtBillingAddress.DataBindings.Add("Text", IMSDBAccess.queryDB("SELECT streetaddress FROM Customer"), "streetaddress"); 
     txtPostcode.DataBindings.Add("Text", IMSDBAccess.queryDB("SELECT postzip FROM Customer"), "postzip"); 
     txtCity.DataBindings.Add("Text", IMSDBAccess.queryDB("SELECT towncity FROM Customer"), "towncity"); 
     txtState.DataBindings.Add("Text", IMSDBAccess.queryDB("SELECT stateprovince FROM Customer"), "stateprovince"); 
     txtCountry.DataBindings.Add("Text", IMSDBAccess.queryDB("SELECT country FROM Customer"), "country"); 

     cboCustomer.DataSource = IMSDBAccess.queryDB("SELECT customerNo, (RTRIM(business_name) + ' (' + CONVERT(varchar(10), customerNo) + ')') AS DisplayValue FROM Customer"); 
     cboCustomer.BindingContext = this.BindingContext; 
     cboCustomer.DisplayMember = "DisplayValue"; 
     cboCustomer.ValueMember = "customerNo"; 
    } 

するとコンボボックスで選択した項目の変更:

private void cboCustomer_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     updateCustomer(); 
    } 

コンボボックスの更新方法:

private void updateCustomer() 
    { 
     MessageBox.Show(cboCustomer.SelectedValue.ToString()); 
     int cNo; 
     bool parseOK = Int32.TryParse(cboCustomer.SelectedValue.ToString(), out cNo); 
     string query = "SELECT * FROM Customer WHERE customerNo = @customerNo"; 

     SqlConnection connectionObj = new SqlConnection(IMSDBAccess.GetConnectionString("")); 
     SqlCommand cmd = new SqlCommand(query, connectionObj); 
     SqlDataReader reader; 

     cmd.Parameters.AddWithValue("@customerNo", cNo); 

     try 
     { 
      connectionObj.Open(); 
      reader = cmd.ExecuteReader(); 

      if (reader.Read()) 
      { 
       txtBillingAddress.Text = reader["streetaddress"].ToString(); 
       txtCity.Text = reader["towncity"].ToString(); 
       txtState.Text = reader["stateprovince"].ToString(); 
       txtCountry.Text = reader["country"].ToString(); 
       txtPostcode.Text = reader["postzip"].ToString(); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message, "Error updating customer info", MessageBoxButtons.OK, MessageBoxIcon.Error, MessageBoxDefaultButton.Button1); 
     } 
    } 

私は正しい順序でデータをバインドする方法を理解できないようcboCustomer内の項目テキストボックスに示されているデータに対応しています。

+0

テキストボックス上のそれらのデータバインディングは、私にとって混乱し、不要です。 1つの行しか期待していないので、 'while'の代わりに' if(reader.Read()) 'を使用してください。多分あなたの顧客のすべてが同じIDを持っていますか? – LarsTech

+0

IDは自動インクリメントされており、すべてが異なっています。私はしばらく変更します。 – Craig

+0

さて、updateCustomerメソッドで 'cNo'の値は何ですか?それは選択と一致しますか? – LarsTech

答えて

0

updateCustomerコマンドを実行するときに、テキストボックスの値を明示的に設定してバインディングを上書きしようとしているようです。代わりに、INotifyPropertyChangedを使用して、コンボの値が変更されたときに値を更新します。このような例のようなものではありませんが、これは役に立ちます:Data binding for TextBox

+0

と一致します。これは良いアイデアです、ありがとう – Craig

関連する問題