C# 在数据库中插入新记录时,组合框值未得到更新

C# 在数据库中插入新记录时,组合框值未得到更新,c#,winforms,combobox,data-binding,C#,Winforms,Combobox,Data Binding,我正在数据库中插入一条记录,除了更新ComboBox的数据源外,一切都正常 下面是刷新组合框的代码: nStateTableAdapter1.Adapter.Update(stateCodeDataSet, "NState"); cmbStateCode.DataSource = nStateBindingSource1.DataSource; cmbStateCode.DisplayMember = "NState.CountryCode"; cmbStateCode.ValueMember

我正在数据库中插入一条记录,除了更新ComboBox的数据源外,一切都正常

下面是刷新组合框的代码:

nStateTableAdapter1.Adapter.Update(stateCodeDataSet, "NState");
cmbStateCode.DataSource = nStateBindingSource1.DataSource;
cmbStateCode.DisplayMember = "NState.CountryCode";
cmbStateCode.ValueMember = "NState.CountryCode";
cmbStateCode.Refresh();
以上代码对我不起作用

有人能帮我用数据库中插入的新值更新组合框吗

编辑:

编辑1:


在设置新值之前,应尝试通过将数据源设置为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();
...

尝试使用SqlCommandBuilder。 此链接指向msdn文章

我更新了你的密码。这对我很有用

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();
        }*/
    }
}

@VadimSentyaev:我已经添加了“保存”按钮上的代码。我想你不需要像那样刷新它,只需清除cb中存在的项目,然后添加新的项目就可以解决问题。也许有必要更新nStateBindingSource1.DataSource?在您提供的代码中,我没有看到stateCodeDataSet和nStateBindingSource1.DataSource之间的连接。@sesamasemaseam:您能给出一个示例吗??我试图这么做,但没有得到..@VadimSentyaev:我已将我的设计窗口中的stateCodeDataSet和nStateBindingSource1分配给combobox。请查看我的EDIT1部分。我已经实现了你的代码。。但是不工作。。。
...
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();
...
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();
        }*/
    }
}