【问题标题】:Clear ComboBox only works sometimesClear ComboBox 仅在某些情况下有效
【发布时间】:2017-11-28 14:10:43
【问题描述】:

我有一个ComboBox,其中包含第 3 级选择(父类别 > 子类别 > 品牌)。当两个更高级别的类别中的任何一个发生更改时,品牌选择的DataSource 应刷新,并重置选择。

现在这对于子类别选择非常有效,但不适用于父类别选择,尽管使用几乎相同的语法。

我当然可以使用cboBrand.Text = string.Empty 进行快速修复,但问题是,品牌组合框仍然拥有与以前相同数量的插槽,只是空的。 IE。如果在更改父类别之前有 3 个品牌选项,则下拉列表中将有 3 个空位。我查了一下,viewModel.BrandOptions 的Count() 为零,所以这不是问题。

有人知道我做错了什么吗?

父类别已更改(不起作用)

private void cboCategory_SelectionChangeCommitted(object sender, EventArgs e)
{
    viewModel.Category = (CategoryModel)cboCategory.SelectedItem;

    // Update sub-category data source
    cboSubCategory.DataSource = viewModel.SubCategoryOptions;

    // Update Brand data source and reset selection
    cboBrand.DataSource = viewModel.BrandOptions;
    cboBrand.SelectedIndex = -1;

}

子类别已更改(这个工作正常)

private void cboSubCategory_SelectionChangeCommitted(object sender, EventArgs e)
{
    if (cboCategory.SelectedItem != null)
        viewModel.SubCategory = (CategoryModel)cboSubCategory.SelectedItem;

    // Update Brand data source and reset selection
    cboBrand.DataSource = viewModel.BrandOptions;
    cboBrand.SelectedIndex = -1;
}

更新

设置cboBrand.DataSource = null 将使其清除组合框。但它不修复下拉列表中的多个空白行。我还检查了(在将数据源更改为 null 之前)数据源中是否有任何对象。正如您在图片中看到的那样,情况并非如此。

【问题讨论】:

  • 在它不起作用的情况下,当你在调试器中查看viewModel.BrandOptions时,你在那个集合中看到了什么?
  • BrandOptions 集合中没有任何内容。下拉列表中也没有任何内容,预计 X 个空白行。
  • 如果您将一个空集合分配给 cboBrand.DataSource,您应该期望 cboBrand 中没有任何内容。看来您的问题是 viewModel.BrandOptions 应该以某种方式填充,在某个地方,在您没有向我们展示的代码中 - 但这没有发生。或者可能,它正在发生,而您正在立即清除它。
  • @EdPlunkett 当我更改父类别时,子类别将设置为默认对象,没有相关品牌。因此,我希望 BrandOptions 为空,并且确实如此。我没有得到的是:1)为什么下拉列表中仍然有 X 个空行和 2)为什么它不会清除选择。
  • 那不是代码。它是对您假设代码正在做什么的描述,抽象程度如此之高,即使正确,它也不会告诉我任何信息。我无法调试它或使用它来重现问题。因为您看到了您不理解的意外行为,所以您的代码不太可能按照您的想法执行。祝你的问题好运。帮助when there's an MVCE更容易。

标签: c# .net winforms combobox


【解决方案1】:

你试过把:

private void cboCategory_SelectionChangeCommitted(object sender, EventArgs e)
{
    viewModel.Category = (CategoryModel)cboCategory.SelectedItem;

    // Update sub-category data source
    cboSubCategory.DataSource = viewModel.SubCategoryOptions;
    cboSubCategory.SelectedIndex = -1; // << new line to blank out SubCat

    // Update Brand data source and reset selection
    cboBrand.DataSource = viewModel.BrandOptions;
    cboBrand.SelectedIndex = -1;

}

...我感觉正在发生的事情是您在两个连续的行中刷新两个数据源,这是一个时间问题 - cboBrand 试图在 cboSubCategory 具有正确的值之前刷新其数据.

【讨论】:

  • 这并没有真正改变任何东西。另外我认为我所看到的是两个不同的问题,有两个不同的原因(请参阅原始帖子中的更新)。
猜你喜欢
  • 2014-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-27
相关资源
最近更新 更多