【问题标题】:How to deleselect / blank a databound ComboBox? SelectedIndex = -1 does not work如何取消选择/空白数据绑定组合框? SelectedIndex = -1 不起作用
【发布时间】:2012-05-12 17:16:25
【问题描述】:

我正在尝试取消选择(清除)我的 Windows 窗体应用程序中的一些组合框。在我的应用程序中,我有一个 Reset 方法,它将每个组合的 SelectedIndex 设置为 -1。我所有的组合框都是数据绑定的,即每个组合框都使用数据源填充。

我注意到有时我的重置方法会起作用,即它会取消选择当前选定的项目并使组合空白。但是,有时它会在我尝试将其设置为 -1 后直接选择第一项 (SelectedIndex = 0)。从用户的角度来看,这看起来像是一个错误,因为它并不总是“清除”表单。

根据 MSDN:

“要取消选择当前选中的项目,请将 SelectedIndex 设置为 -1。如果项目是数据绑定项目,则不能将 ComboBox 项目的 SelectedIndex 设置为 -1。”

有人知道变通办法吗?

非常感谢

【问题讨论】:

标签: c# .net winforms combobox


【解决方案1】:

使用 void 和属性的组合

comboBox.ResetText();

 //to reset selected value
comboBox.SelectedIndex = -1;

【讨论】:

  • 为我工作。谢谢。
  • 对我来说ResetText() 已经足够了。将SelectedIndex 设置为-1 是否有原因?
  • 是的,这是有原因的,因为如果您使用带有 backgroundworker 的绑定源,它会在渲染后更新 GUI,所以绑定后将删除没有剩余值的文本,因为您需要同时使用这两个
【解决方案2】:

不知道是否还有人对此感兴趣,因为现在已经 5 年了,但我找到了一个非常简单的解决方法。完全不直观(我只是通过查看参考源代码才发现它),但实现起来很简单:

ComboBox1.FormattingEnabled = True;

是的,就是这样!

如果您好奇,可以细读source code 以了解发生了什么。 @CuppM 指出的错误的根本原因似乎是试图在数据源中设置位置:

if (!FormattingEnabled || SelectedIndex != -1) {
    this.DataManager.Position = this.SelectedIndex;
} 

我猜它应该只是 '&&' 而不是 '||'在这种情况下,因为代码可能不应该将 Position 设置为无效值,而不管 FormattingEnabled 属性如何。

无论如何,它允许一个简单的解决方法。并且由于“格式”属性为空白时的默认行为是无操作的,因此您无需更改任何其他内容。它只是工作。 :-)

(我应该注意,我只在 .NET 4.7 上尝试过这个,所以我不能说它是否适用于 .NET Framework 的早期版本。)

【讨论】:

  • 你这个男人!这非常有效。之前,我第一次设置 SelectedItem = Nothing 时,ComboBox 将定位在第一个项目上,然后我不得不再次这样做以获得无选择。现在可以正常工作了。令人惊奇的是,您设法浏览了参考代码。
  • 这应该是公认的答案。它甚至记录在 MSDN 上的这篇文章中。 docs.microsoft.com/en-us/dotnet/api/…)。谢谢。
【解决方案3】:

您可以尝试将所选值或项目设置为null(VB 中为Nothing

我不记得抛出异常的行为。但是,我确实记得在组合框通常通过数据绑定事件进行数据绑定后,我曾经在组合框中插入一个名为 -1, (None) 的值。我建议获取列表中的数据并将新值插入此列表。立即将组合绑定到列表。

【讨论】:

  • SelectedItem,是的。但是,如果将 SelectedValue 设置为 null(并且 ComboBox 是数据绑定的),它将引发异常。
  • 另外,无论如何绑定到实时数据并不是一个好主意。始终检索本地列表中的数据并绑定到列表。希望您使用的是 LINQ。
  • 将其设置为 SelectedValue 确实引发了异常, SelectedIndex=null 工作,但是在一个特定的组合框(下拉)上我不得不这样做两次,这很奇怪。我不确定为什么?另外我没有使用 LINQ,我的项目必须是 .net 2
  • 当你说两次时,你是什么意思?就像把这行写两遍,一个接一个?
【解决方案4】:

只有以下代码适合我,所以试试吧:

comboBox.ResetText();   //framework  4.0 

【讨论】:

    【解决方案5】:

    ComboBox1.SelectedItem = null;

    【讨论】:

      【解决方案6】:

      对于仍在查看这篇旧帖子的任何人,我想从Hisham answer 添加一个注释。
      确保插入他的代码后清除您的列表。

      comboBox.ResetText();
      
      //to reset selected value
      comboBox.SelectedIndex = -1;
      comboBox.Items.Clear();
      

      【讨论】:

        【解决方案7】:

        尝试将nullString.Empty 分配给SelectedValue 属性。

        【讨论】:

          【解决方案8】:

          如果您的目标框架是 4.0 - 这是解决方案:

          安装 .Net Framework 4.5(不要更改项目的目标框架,只需安装框架即可)。 安装后,该行取消选择数据绑定组合框:

          combobox.SelectedValue = 0;
          

          我的值成员是 "Id" int 主键自增,所以该字段不包含值 0。 但是,这不适用于不支持 .net45 的 Windows 版本

          【讨论】:

            【解决方案9】:

            尝试设置[ComboBoxObj].SelectedIndex=-1;这将使其为空值。 -1 表示取消选择或取消组合框的值

            谢谢

            【讨论】:

              【解决方案10】:

              这个问题我有一段时间了,但是如果你使用:

              'ComboBox.ResetText();'

              它将使文本 "" 并使组合框中的项目不受影响。

              我在我的应用程序中使用了以下代码

               private void UpdateComboBox(ComboBox Box, string Group, List<string> Numbers)
                      {
                            Box.Items.Clear();
                            Box.BeginUpdate();            
                            Box.Items.Add("<<Add Contact>>");
                            foreach (string item in Numbers)
                            {
                                 if(item != "")
                                      Box.Items.Add(item);
                            }
                        Box.EndUpdate();
                        Box.ResetText();
                      }
              

              所以我最后运行该方法,一旦所有项目都在组合框中。

              【讨论】:

                【解决方案11】:

                试试这行代码:

                combobox1.Items.clear();
                

                它对我有用。

                【讨论】:

                • 请在您的答案中添加一些解释,以便其他人可以从中学习
                【解决方案12】:

                向您的组合框中添加一个空项目,如下所示:

                cb.Items.Add("");
                

                在此之后,您可以通过选择最后一个 cb 项来取消选择您的组合框:

                cb.SelectedIndex = cb.Items.Count - 1;
                

                给你!

                您的组合框中的最后一个位置是空的,但它不会打扰您。会吗? :-)

                【讨论】:

                  【解决方案13】:

                  我收到以下错误:

                  位置0没有行

                  当我将 ComboBox.SelectedItem 设置为 -1 时。

                  替换为ComboBox.ResetText() 工作正常。这是使用 .Net 4.6.1,使用 VS 2013,其中 TextFormatting = True 默认为 ComboBoxes

                  【讨论】:

                    【解决方案14】:

                    您可以尝试使用此解决方案..

                    dataGrid.DataSource = Nothing
                    
                    dataGrid.DataBind()
                    

                    希望有帮助!..:D

                    【讨论】:

                    • dataGrid ??你是说组合框吗?
                    • 这被清楚地标记为 C#,而不是 VB。另外,他说的是 ComboBox,而不是 DataGrid。
                    • dataGrid.DataSource = null dataGrid.DataBind()
                    猜你喜欢
                    • 2014-12-23
                    • 1970-01-01
                    • 1970-01-01
                    • 2012-08-07
                    • 1970-01-01
                    • 2015-02-21
                    • 1970-01-01
                    • 2021-04-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多