【问题标题】:Setting ListBox.SelectedItem using custom comparison使用自定义比较设置 ListBox.SelectedItem
【发布时间】:2018-06-06 21:07:00
【问题描述】:

我创建了一个实现IComparable<> 的类。像这样。

public class Entry : IComparable<Entry>
{
    private string Data;

    public Entry(string data)
    {
        Data = data;
    }

    // Implementation...

    public int CompareTo(Entry entry)
    {
        return Data.CompareTo(entry.Data);
    }
}

然后我用这些对象填充ListBox 控件。

我的期望是我可以执行以下操作。但这似乎没有效果(并且没有抛出异常)。

Entry entry = new Entry("...");
MyListBox.SelectedItem = entry;

我认为它会使用我的自定义比较代码来查找匹配项。但是如果我在Entry.CompareTo() 中设置断点,它就永远不会被命中。

在网上搜索,有关设置SelectedItem 属性的信息似乎很薄。有人能解释一下这里发生了什么吗?

【问题讨论】:

  • public class Entry : IEquatable&lt;Entry&gt;
  • @LarsTech:好的,为什么这行得通但IComparable&lt;&gt; 行不通?
  • IComparable 用于排序。
  • @LarsTech:好吧,好吧。这似乎很奇怪,我需要两个不同的接口来测试相等性和比较排序。 IComparable 也可以通过返回零来表示相等。无论如何,我尝试实现 IEquatable&lt;&gt; 和实现 Equals 但那里的断点也没有命中。
  • 您的代码示例不起作用。您创建一个名为 entry 的“新”对象,然后尝试选择它。没有迹象表明您的“新”对象在该列表中。

标签: .net winforms listbox


【解决方案1】:

尝试实现 IEquatable 接口。由于您显然不关心对象比较,因此您可以在 Data 字段(可能应该是一个属性)上返回 String.Equals 结果的结果。

public class Entry : IEquatable<Entry>  {
  private string Data = string.Empty;

  public Entry(string data) {
    Data = data;
  }

  public bool Equals(Entry other) {
    if (other == null) return false;
    return String.Equals(this.Data, other.Data);
  }

  public override bool Equals(object obj) {
    return Equals(obj as Entry);
  }

  public override int GetHashCode() {
    return this.Data.GetHashCode();
  }
}

【讨论】:

  • 谢谢,但正如我们在 cmets 中讨论的那样,当我尝试这个时,我得到了相同的结果。
  • @JonathanWood 你正在做一些我看不到的事情,因为这对我有用。
  • 那到底是什么意思。你用上面的代码测试过吗?你如何设置SelectedItem?当您设置的项目实际上不在列表中时,它是否有效?您是否在 Equals 方法中设置了断点?
  • @JonathanWood 是的。我添加了项目,例如listBox1.Items.Add(new Entry("one")); 等。然后我做了listBox1.SelectedItem = new Entry("two");,它选择了列表中的第二个项目。
  • 是的,你是对的。我已经实现了IEquatable&lt;&gt;,但缺少Equals 覆盖。仍然很困惑为什么只有一个真正需要的比较接口。
猜你喜欢
  • 2017-06-07
  • 2021-03-17
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多