Почему моя привязка данных combobox не работает?

Я создаю простое приложение для выставления счетов, которое берет некоторые детали из формы и создает 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";
    }

При изменении выбранного элемента в поле combobox:

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

Метод обновления Combobox:

    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 ответ

  1. Похоже, что вы пытаетесь перезаписать привязки, явно задав значения текстовых полей при выполнении команды updateCustomer. Вместо этого посмотрите на использование INotifyPropertyChanged для обновления значений при изменении значения комбо. Это не like for like пример, но это может помочь: привязка данных для TextBox