如何在winform上刷新数据驱动的组合框

时间:2009-11-10 01:54:42

标签: c# .net windows visual-studio winforms

我有一个winform,其中包含一个从数据库中的查询中填充的组合框。如果我向数据库添加一个字段,新字段将不会显示在表单中,直到我关闭它并重新打开它。

我能够放入一个MessageBox.Show(),一旦弹出,我关闭它,并在组合框中看到新数据。

编辑:

让我澄清一下。我有一个下拉组合框,它由表适配器填充。我只是用GUI进行数据绑定,所以我不确定它是如何工作的。

我想要的是,当我回到它时,我希望我输入的新数据能够刷新。我有一个单独的窗口来管理数据,然后我关闭它我希望组合框更新我刚刚保存的内容。

这可能吗?我尝试在表单加载上执行此操作,但这也不起作用,我认为因为表单已经加载。

7 个答案:

答案 0 :(得分:7)

Refresh方法不适用于此。您想要实现的是刷新数据绑定。这将是这样的:

cb.DataBindings[0].ReadValue();

另一种方法是使用支持更改通知的数据源。此类数据源使用适当的参数触发ListChanged事件,以触发绑定到它的控件的更新。

答案 1 :(得分:3)

您必须再次通过

从数据集填充表适配器
youTableAdapter.Fill(yourdataSet.tablename);

然后你必须重新分配数据源

this.combobox.DataSource = this.yourBindingSource;

最后你可以刷新你的组合框

combobox.Refresh();

答案 2 :(得分:1)

这取决于您的数据网格绑定的内容。假设数据源的ListChanged事件被正确触发,重新填充数据源(如DataTable或自定义BindingList)应自动重新填充网格。

答案 3 :(得分:1)

如果我理解正确的话,你可以做的一件事就是使用ListChanged事件,就像上面提到的一样,但好像这样做不起作用。

TableAdapter实际上不是标准意义上的表,而是临时存储区。

查看Form1_Load函数(或任何您命名的表单,只使用默认值)并查找tableadapter.fill方法。 this.comboboxTableAdapter.Fill(yourdataset名称)。这实际上填充了您的数据集。

创建一个填充这些数据集的函数(如果您有多个),然后在ListChanged事件上调用该函数,甚至在表单的Activate事件上调用该函数。这样,当您进入该子表单并更改数据时,当您返回主表单时,数据将存在。

我希望这对你的项目有所帮助,祝你好运。

答案 4 :(得分:1)

这对我有用。当我刷新辅助数据集(第一行)时,组合框最初没有获取新值,因此我将dataTable重新分配为DataSource(第三行)。

boundDataSet = proxy.ReadResources();
DataGridViewComboBoxColumn nameColumn = dataGrid.Columns["Name"] as DataGridViewComboBoxColumn;
nameColumn.DataSource = boundDataSet.Table;

答案 5 :(得分:0)

         cmbguest.DataSource = null;
         loadguestDetails();

使数据集为null并重新绑定组合框然后你可以在winforms中刷新数据驱动的组合框

答案 6 :(得分:0)

子窗体内部;

private void UpdateAccount_FormClosed(object sender, FormClosedEventArgs e)
{    
   ParentForm parentForm= (ParentForm )Application.OpenForms["ParentFormName"];
   parentForm.GetAccounts();
}

内部的父母表格;

 public void GetAccounts()
    {
        AccountData lastSelectedItem = (AccountData)cbAccounts.SelectedItem;
        cbAccounts.Items.Clear();
        List<AccountData> accountDatas = AccountXML.ReadAccountXML();
        if (accountDatas != null)
            foreach (var item in accountDatas)
            {
                cbAccounts.Items.Add(item);
            }

        if(lastSelectedItem != null)
        {
            cbAccounts.SelectedText = lastSelectedItem.AccountName;
        }

    }