Значение ComboBox не обновляется при добавлении новой записи в базу данных - PullRequest
0 голосов
/ 01 апреля 2012

Я вставляю запись в базу данных, и все работает нормально, за исключением обновления DataSource для ComboBox.

Здесь мой код для обновления выпадающего списка:

nStateTableAdapter1.Adapter.Update(stateCodeDataSet, "NState");
cmbStateCode.DataSource = nStateBindingSource1.DataSource;
cmbStateCode.DisplayMember = "NState.CountryCode";
cmbStateCode.ValueMember = "NState.CountryCode";
cmbStateCode.Refresh();

Вышеуказанный код не работает для меня.

Может кто-нибудь помочь мне, как обновить Combobox с новым значением, вставленным в базу данных?

РЕДАКТИРОВАТЬ:

    private void btnSave_Click(object sender, EventArgs e)
    {
        if (cmbStateCode.Text.ToString().Trim() == "" && txtCountryName.Text.ToString().Trim() == "")
        {
            MessageBox.Show("Please enter a valid data.", "Office Automation System", MessageBoxButtons.OK, MessageBoxIcon.None);
        }
        else
        {
            btnSave.Enabled = false;
            btnEdit.Enabled = true;
            try
            {
                string Query;
                sqlCon.Open();
                if (isEditMode)
                    Query = "UPDATE NState SET CountryName='" + txtCountryName.Text.ToString().Trim() + "' WHERE CountryCode='" + cmbStateCode.Text + "'";
                else
                    Query = "INSERT INTO NState VALUES ('" + cmbStateCode.Text + "','" + txtCountryName.Text.ToString().Trim() + "')";
                SqlCommand sqlCmd = new SqlCommand(Query, sqlCon);
                sqlCmd.ExecuteNonQuery();
                cmbStateCode.DropDownStyle = ComboBoxStyle.DropDownList;
                MessageBox.Show("Record saved successfully.", "Office Automation System", MessageBoxButtons.OK, MessageBoxIcon.None);
            }
            catch
            {
                MessageBox.Show("Error occured while saving record.\nPlease check the StateCode for duplicate.", "Office Automation System", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
            finally
            {
                sqlCon.Close();
            }
            try
            {
                sqlCon.Open();
                fillStateInfo();
                nStateTableAdapter1.Adapter.Update(stateCodeDataSet, "NState");
                cmbStateCode.DataSource = nStateBindingSource1.DataSource;
                cmbStateCode.DisplayMember = "NState.CountryCode";
                cmbStateCode.ValueMember = "NState.CountryCode";
                cmbStateCode.Refresh();
            }
            catch (Exception ex)
            {
            }
            finally
            {
                sqlCon.Close();
            }
        }

РЕДАКТИРОВАТЬ1:

  sqlCon.Open();
  SqlDataAdapter da = new SqlDataAdapter("select * from NState", sqlCon);
  SqlCommandBuilder builder = new SqlCommandBuilder(da);
  if (isEditMode)
      nStateTableAdapter1.Adapter.UpdateCommand = builder.GetUpdateCommand();
  else
      nStateTableAdapter1.Adapter.InsertCommand = builder.GetInsertCommand();
  nStateTableAdapter1.Adapter.Update(stateCodeDataSet, "NState");
  fillStateInfo();

Ответы [ 2 ]

0 голосов
/ 01 апреля 2012

Попробуйте использовать SqlCommandBuilder.Эта ссылка на статью MSDN http://msdn.microsoft.com/en-us/library/system.data.common.dataadapter.update.aspx

И я обновил ваш код.Это работает для меня.

private void btnSave_Click(object sender, EventArgs e)
{
    if (cmbStateCode.Text.ToString().Trim() == "" && txtCountryName.Text.ToString().Trim() == "")
    {
        MessageBox.Show("Please enter a valid data.", "Office Automation System", MessageBoxButtons.OK, MessageBoxIcon.None);
    }
    else
    {
        btnSave.Enabled = false;
        btnEdit.Enabled = true;
        // update your DataSet directly instead of this
        /*try
        {
            string Query;
            sqlCon.Open();
            if (isEditMode)
                Query = "UPDATE NState SET CountryName='" + txtCountryName.Text.ToString().Trim() + "' WHERE CountryCode='" + cmbStateCode.Text + "'";
            else
                Query = "INSERT INTO NState VALUES ('" + cmbStateCode.Text + "','" + txtCountryName.Text.ToString().Trim() + "')";
            SqlCommand sqlCmd = new SqlCommand(Query, sqlCon);
            sqlCmd.ExecuteNonQuery();
            cmbStateCode.DropDownStyle = ComboBoxStyle.DropDownList;
            MessageBox.Show("Record saved successfully.", "Office Automation System", MessageBoxButtons.OK, MessageBoxIcon.None);
        }
        catch
        {
            MessageBox.Show("Error occured while saving record.\nPlease check the StateCode for duplicate.", "Office Automation System", MessageBoxButtons.OK, MessageBoxIcon.Warning);
        }
        finally
        {
            sqlCon.Close();
        }*/

        SqlCommandBuilder builder = new SqlCommandBuilder(nStateTableAdapter1);
        if (isEditMode)
        {
            // update DataSet
            nStateTableAdapter1.UpdateCommand = builder.GetUpdateCommand();
        }           
        else
        {
            // insert value to DataSet
            nStateTableAdapter1.InsertCommand = builder.GetUpdateCommand();
        }

        nStateTableAdapter1.Adapter.Update(stateCodeDataSet, "NState");

        // it's not necessary, ComboBox will have a new values  
        /*try
        {
            sqlCon.Open();
            fillStateInfo();
            nStateTableAdapter1.Adapter.Update(stateCodeDataSet, "NState");
            cmbStateCode.DataSource = nStateBindingSource1.DataSource;
            cmbStateCode.DisplayMember = "NState.CountryCode";
            cmbStateCode.ValueMember = "NState.CountryCode";
            cmbStateCode.Refresh();
        }
        catch (Exception ex)
        {
        }
        finally
        {
            sqlCon.Close();
        }*/
    }
}
0 голосов
/ 01 апреля 2012

Вы должны попытаться сбросить привязку, установив DataSource в null перед установкой нового значения:

...
sqlCon.Open();
fillStateInfo();
nStateTableAdapter1.Adapter.Update(stateCodeDataSet, "NState");
cmbStateCode.DataSource = null; // reset binding
cmbStateCode.DataSource = nStateBindingSource1.DataSource;
cmbStateCode.DisplayMember = "NState.CountryCode";
cmbStateCode.ValueMember = "NState.CountryCode";
cmbStateCode.Refresh();
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...