2

我有一个应用程序,我需要用公司名称填充一个文本框,并且我已经用数据库中所有可用的公司名称填充了一个自定义 AutoCompleteStringColection。当用户通过键入并从列表中选择一个新公司名称来更改公司名称时,我需要拥有所选公司的 id (Guid),以便我可以进行查找并获取公司的其余信息。因为公司名称不能保证是唯一的,所以我无法对名称进行查找并期望拥有正确的记录。我查看了扩展字符串类,但我能找到的只是添加方法的示例。我尝试通过添加一个变量来存储 id 以及获取和设置 id 的方法,但是在检索 id 时它始终是最后一个 id 集。可以通过扩展将属性添加到类中吗?我已经改变了我试图做的事情来查找公司名称并显示一个列表,如果返回多个匹配项,用户将从中选择,但我仍然想知道我是否可以通过这种方式添加属性以防万一它又出现了。

4

4 回答 4

7

不,您不能使用属性扩展类。此外,您不能通过继承来扩展它Stringsealed唯一的办法是组合:封装string在你自己的类中。

于 2009-01-30T19:40:50.557 回答
2

听起来您应该创建自己的类:

class Company {
    public string Name {get;set;}
    public override string ToString() {return Name;}
    // etc
}

现在绑定到一组Company对象;覆盖将ToString确保Name默认显示 ,您可以添加所需的任何其他内容。对于更复杂的场景,您可以使用(例如)DisplayMemberValueMember(组合框的)指向不同的属性(而不是默认的ToString)。

于 2009-01-30T19:57:04.690 回答
1

您应该使用 ComboBox 而不是 TextBox。创建一个包含您的公司名称和 ID 的自定义类型,确保它覆盖 ToString 以返回公司名称。将这些自定义类型添加到 ComboBox 而不是直接字符串,并使用 ListItems 的 AutoCompleteSource。

于 2009-01-30T19:57:07.950 回答
0

我使用了 Konrad 的答案,为了完整起见,我在这里发布了我的解决方案。我需要向我的用户显示公司名称的自动完成列表,但由于他们可能有多个同名公司,我需要 Guid id 才能在数据库中找到他们的选择。所以我写了我自己的继承自 AutoCompleteStringCollection 的类。

    public class AutoCompleteStringWithIdCollection : AutoCompleteStringCollection
{
    private List<Guid> _idList = new List<Guid>();


    /*-- Properties --*/

    public Guid this[int index]
    {
        get
        {
            return _idList[index];
        }
    }

    public Guid this[string value]
    {
        get
        {
            int index = base.IndexOf(value);
            return _idList[index];
        }
    }

    /*-- Methods --*/

    public int Add(string value, Guid id)
    {
        int index = base.Add(value);
        _idList.Insert(index, id);
        return index;
    }

    public new void Remove(string value)
    {
        int index = base.IndexOf(value);
        if (index > -1)
        {
            base.RemoveAt(index);
            _idList.RemoveAt(index);
        }
    }

    public new void RemoveAt(int index)
    {
        base.RemoveAt(index);
        _idList.RemoveAt(index);
    }

    public new void Clear()
    {
        base.Clear();
        _idList.Clear();
    }

}
于 2009-06-12T20:27:23.887 回答