Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Отображать конкретное поле содержимого списка в ComboBox (C#)

Автор вопроса: AndresОтветов: 2

Ну, мой вопрос немного глупый, но я пробовал много разных вещей безрезультатно.

У меня есть ComboBox в моей основной форме, и я хочу указать его источник данных на общедоступный список List PriceChanges только для чтения, объявленный в классе Filters. С этим проблем нет, но я хочу указать поле "Описание".

Я безуспешно пытался присвоить строку "Описание" атрибуту DisplayMember. В моем ComboBox перечислены только: "BusinessLogic.PriceChange" для каждой записи, где BusinessLogic - это имя моего пространства имен, а PriceChange - класс.

Я ценю любую помощь.

С уважением

Это часть кода моей основной формы

    public mainFrm()
    {
        InitializeComponent();

        prodFilter = new Filters();
        cbPriceChanges.DataSource = prodFilter.PriceChanges;
        cbPriceChanges.DisplayMember = "Description"
    }

Это часть кода, объявляющего объект List.

public enum PriceChangeTypes
{
    No_Change,
    Increased,
    Decreased,
    All
}

public class PriceChange
{
    public String Description;
    public readonly PriceChangeTypes Type;

    public delegate bool ComparisonFuntionDelegate(Decimal a);
    public readonly ComparisonFuntionDelegate ComparisonFunction;

    public PriceChange(String Description, PriceChangeTypes type , ComparisonFuntionDelegate CompFunc)
    {
        this.Description = Description;
        Type = type;
        ComparisonFunction = CompFunc;
    }
}

public class Filters
{

    public readonly List<PriceChange> PriceChanges = null;

    public Filters()
    {
        PriceChanges = new List<PriceChange>();

        PriceChanges.Add(new PriceChange("No Change", PriceChangeTypes.No_Change, PriceChange => PriceChange == 0));
        PriceChanges.Add(new PriceChange("Increased", PriceChangeTypes.Increased, PriceChange => PriceChange > 0));
        PriceChanges.Add(new PriceChange("Decreased", PriceChangeTypes.Decreased, PriceChange => PriceChange < 0));
        PriceChanges.Add(new PriceChange("All", PriceChangeTypes.All, a => true));
    }
}
  • Description, Type, ComparisonFuntionDelegate и ComparisonFunction действительно должны быть закрытыми или превращены в свойства. Robert Venables 30.08.2009

listuser-interfacecombobox

Ответы

Ответ 1 · рейтинг 1 · Paolo Tedesco

Вы пытались сделать "Описание" свойством? Это сильно изменится, если список попытается получить поле через отражение (что, скорее всего, и происходит).

public class PriceChange {
    public string Description{
        get;
        set;
    }
    // ...
}

Ответ 2 · MartW

Попробуйте добавить это в свой класс:

public override string ToString()
        {
            return Description;
        }

В настоящее время вы просто получаете значение по умолчанию ToString, которое является пространством имен и классом объекта.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы