Расширение класса String, со свойствами?

голоса
2

У меня есть приложение, где мне нужно, чтобы заполнить текстовое поле с названием компании, и я заполнил пользовательский AutoCompleteStringColection со всей доступным названием компаний из базы данных. Когда пользователь вводит изменяет название компании, введя и выбрав из списка нового названия компании мне нужно иметь идентификатор (GUID), выбранную компании, так что я могу сделать поиск и получить остальную информацию о компании. Потому что название компании не гарантировано быть уникальным, я не могу сделать поиск по имени и ожидать, чтобы иметь право записи. Я посмотрел на расширение класса строки, но все, что я могу найти примеры, которые добавляют методы. Я попробовал, добавив переменную для хранения идентификатора и метод, чтобы получить и установить идентификатор, но при извлечении идентификатора это всегда последний набор идентификатора. Может ли свойство быть добавлены к классу, расширив его? Я уже изменил то, что я пытался сделать, чтобы сделать поиск по имени компании и отображения списка пользователь будет выбирать из того, если несколько матчей вернулся, но я все же хотел бы знать, могу ли я добавить свойство таким образом, в случае он приходит снова.

Задан 30/01/2009 в 20:38
источник пользователем
На других языках...                            


4 ответов

голоса
7

Нет, вы не можете расширить классы свойств. Кроме того, Stringэто sealedтак , вы не можете расширить его с помощью наследования. Единственным выходом является состав: инкапсулировать stringв собственном классе.

Ответил 30/01/2009 в 20:40
источник пользователем

голоса
2

Похоже, вы должны создать свой собственный класс:

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

Теперь связываются с набором Companyобъектов; ToStringпереопределение будет гарантировать , что Nameотображается по умолчанию, и вы можете добавить все остальное , что вам нужно. Для более сложных сценариев, вы можете использовать (например) DisplayMemberи ValueMember(из комбо-бокс) , чтобы указать на различные свойства (а не по умолчанию ToString).

Ответил 30/01/2009 в 20:57
источник пользователем

голоса
1

Вы должны использовать ComboBox, а не TextBox. Создание пользовательского типа, который имеет название компании и идентификатор в нем, убедившись, что он отменяет ToString возвращает имя компании. Добавьте эти пользовательские типы в ComboBox, а не строки с прямыми, и использовать AutoCompleteSource из ListItems.

Ответил 30/01/2009 в 20:57
источник пользователем

голоса
0

Я использовал ответ Конрада и для полноты картины я отправляю мое решение здесь. Мне нужно было показать мой пользователь список автозаполнения названий компаний, но так как они могут иметь несколько компаний с таким же именем мне нужен Guid идентификатор, чтобы найти свой выбор в базе данных. Поэтому я написал свой собственный класс, унаследованный от 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();
    }

}
Ответил 12/06/2009 в 21:27
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more