【问题标题】:How to refresh data driven combo box on a winform如何在winform上刷新数据驱动的组合框
【发布时间】:2010-12-14 21:08:17
【问题描述】:

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

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

编辑:

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

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

这可能吗?我试图在表单加载时这样做,但这也不起作用,我认为是因为表单已经加载。

【问题讨论】:

  • 嘿,好问题,我希望有人回答你。我没有遇到过这种特殊情况,所以我很感兴趣。 +1!

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


【解决方案1】:

子窗体内部;

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;
        }

    }

【讨论】:

    【解决方案2】:
             cmbguest.DataSource = null;
             loadguestDetails();
    

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        您必须再次从数据集中填充表格适配器

        youTableAdapter.Fill(yourdataSet.tablename);
        

        那么你必须重新分配数据源

        this.combobox.DataSource = this.yourBindingSource;
        

        最后你可能会刷新你的组合框

        combobox.Refresh();
        

        【讨论】:

          【解决方案5】:

          如果我理解正确,您可以做的一件事是使用 ListChanged 事件,就像提到的那样,但似乎这不起作用。

          TableAdapter 并不是标准意义上的表,而是一个临时存储区域。

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

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

          我希望这会有所帮助,并祝您的项目好运。

          【讨论】:

            【解决方案6】:

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

            【讨论】:

            • ListChanged 事件的唯一触发时间是在您打开程序时。我将 ListChanged 设置为一个刚刚弹出消息框的方法,打开程序时它出现了大约 5 次,之后就再也没有改变过。
            • 我认为你的理解有点不对。 ListChanged 是由 DATASOURCE 触发的事件。 AFAIK BindingSource 不支持更改通知,因此它不会触发 ListChanged,这就是 DataGridView 或 ComboBox 或绑定到它的任何内容不刷新其内容的原因。为了充分利用 winforms 的绑定功能,我必须编写自己的集合版本,该集合实现 IBindingList 与那里的所有内容(更改通知、排序、搜索)
            • @kubal5003:BindingSource 有一个 ListChanged 事件,该事件在底层列表更改时发生。
            【解决方案7】:

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

            cb.DataBindings[0].ReadValue();
            

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

            【讨论】:

            • 我尝试在 ListChanged 事件中添加一些内容,但似乎没有重绘控件。也许更好的问题是,如何重绘一个由绑定数据集填充的组合框?
            • 我有一个包含项目列表的数据集,这些项目只是从数据库登录。它通过绑定源绑定到表适配器。当我弹出另一个表单时,它是用来修改数据的,可以添加登录名等信息,然后点击保存,关闭表单。但是,当您返回到该父表单时,组合框不会显示新信息,除非您关闭程序并再次重新打开它(如果这样的话)。
            猜你喜欢
            • 2018-05-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-10-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多