【问题标题】:c# - how can I update ComboBoxc# - 我如何更新组合框
【发布时间】:2018-08-15 05:54:10
【问题描述】:

我有一个带有DataGridViewcombobox 的表格。 Combobox 通过属性菜单中的 DataSource 填充,我也通过此菜单指定 DisplayMember 和 ValueMember。 我有一个按钮,当我单击它时,会显示另一个表单,我可以向组合框的数据源添加一个新项目。 当我关闭这个新表单时,我希望我的组合框的数据源刷新,以便我可以看到我刚刚在组合框中添加的新项目,但我不知道如何。

我试过了:

myComboBox.Refresh();

但是什么都没发生

我也试过这个:

myComboBox.Items.Add(myclass.myNewItem);

但它会引发异常:

设置数据源属性时无法修改项目集合。

有人可以帮帮我吗?

编辑: 我发现当我在第二种形式中添加一个新项目时,一切都很好,新项目也被添加到数据库中,但是当我返回第一种形式时,听起来好像什么也没发生。所以我将列表框添加到第二种形式,回到第一种形式后我没有看到任何添加。我真的不知道为什么组合框和列表框使用旧数据源,即使我的数据库发生了变化。 然后我尝试了这个并且成功了:

在第二种形式中,我将新项目保存在一个类中(命名为转移),当我返回第一种形式时这样做:

        DsMy.tblRow row = dsMy.tbl.NewtblRow();
        row.BeginEdit();
        row.Name = transfer.newName;
        row.Id = transfer.newId;
        row.EndEdit();

        dsMy.tbl.AddtblRow(row);


        this.Validate();
        tblTableAdapter.Update(dsMy.tbl);
        myComboBox.Refresh();

感谢大家的帮助! :)

【问题讨论】:

标签: c# winforms combobox


【解决方案1】:

更新

在包含组合框的主窗体中。我猜你的代码是这样的

private void btnAddNewObjectsButton_Click(object sender, EventArgs e)
        {
            AddNewObjectsForm form2 = new AddNewObjectsForm();
            form2.ShowDialog();
            if (form2.isSuccess)
            {
                this.myComboBox.DataSource = null;
                this.myComboBox.Items.Clear();
                this.myComboBox.DataSource = db.Object.ToList();//If you work with Entity frame work
                cmbCustomer.ValueMember = "Id";
                cmbCustomer.DisplayMember = "Name";
            }
        }

在另一种形式上,您的代码将是这样的

 public partial class AddNewdbObjects : Form
        {
         //isSuccess is a flage that will be true if the new object is added to db or no
        public isSuccess = false;
        //After Constructor in your click event
        private void btnSave_Click(object sender, EventArgs e)
                {
                    //Intialize data base source;
                    _db = new DBEntities();
                    dbObject obj = new dbObject();
                    obj.Name = txtName.Text;
                    try
                    {
                        _db.dbObject.Add(cust);
                        _db.SaveChanges();
                        isSuccess = true;
                        this.Close();
                    }
                    catch (Exception exc)
                    {
                        isSuccess = false;
                    }
        }
    }

这个解决方案应该适合你。

【讨论】:

  • 没错,但即使我找到了解决方案,但我仍然不明白为什么在第一种形式中,尽管我的数据库已更新,但我的组合框仍然使用旧数据源。
  • 注意如果你绑定了一个没有实现IBindingList接口的数据源,比如ArrayList,当数据源更新时,绑定控件的数据不会更新。
  • 如果此答案或任何答案正确,请标记为正确答案。
【解决方案2】:

试试这个:

DataTable table = new DataTable();
DataRow row;
DataColumn column;         

// Create new DataColumn, set DataType, ColumnName and add to DataTable.    
column = new DataColumn();
column.DataType = System.Type.GetType("System.Int32");
column.ColumnName = "ValueMember";
table.Columns.Add(column);

// Create second column.
column = new DataColumn();
column.DataType = Type.GetType("System.String");
column.ColumnName = "DisplayMember";
table.Columns.Add(column);

row = table.NewRow();
row["ValueMember"] = 1;
row["DisplayMember"] = "item";
table.Rows.Add(row);

comboBox1.DataSource = null;
comboBox1.DataSource = table;
comboBox1.DisplayMember = "DisplayMember";
comboBox1.ValueMember = "ValueMember";

希望对你有帮助:)

【讨论】:

    【解决方案3】:

    我所要做的就是填满 TableAdapter,然后刷新组合框:

        tblTableAdapter.Fill(dsMy.tbl);
        myComboBox.Refresh();
    

    【讨论】:

      猜你喜欢
      • 2011-04-14
      • 1970-01-01
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-25
      相关资源
      最近更新 更多