私はフォームから詳細を取り込んでPDFファイルを作成する簡単な請求書作成アプリケーションを作成しています。データはSQL Serverデータベースに格納されます。なぜ私のコンボボックスデータバインディングは機能しませんか?
問題は、選択されたときに正しい顧客情報が表示されない項目のコンボボックスコントロールにあります。最初の項目は、データベース内の最後のレコードの詳細を表示し、その逆も同様です。問題の
コントロール:
Customer
がテーブル:
IMSDBAccess
がデータベースにクエリのを処理するためのクラスであるときに、フォームのロード、データバインディング
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内の項目テキストボックスに示されているデータに対応しています。
テキストボックス上のそれらのデータバインディングは、私にとって混乱し、不要です。 1つの行しか期待していないので、 'while'の代わりに' if(reader.Read()) 'を使用してください。多分あなたの顧客のすべてが同じIDを持っていますか? – LarsTech
IDは自動インクリメントされており、すべてが異なっています。私はしばらく変更します。 – Craig
さて、updateCustomerメソッドで 'cNo'の値は何ですか?それは選択と一致しますか? – LarsTech