Динамически добавить поле в коллекцию в C #? - PullRequest
2 голосов
/ 15 декабря 2009

У меня есть базовый код привязки данных выпадающего списка. Мне нужно изменить источник данных во время выполнения и вставить новое поле.

  ddlPrimaryCarrier.DataSource = FinancialInstitutions;
            ddlPrimaryCarrier.DataValueField = "EntityCode";
            ddlPrimaryCarrier.DataTextField = "EntityNameDesc";
            ddlPrimaryCarrier.DataBind();

Я действительно хочу добавить в коллекцию поле, представляющее собой отформатированную строку описания и кода. Например ...

var newField = string.Format("({0}) - {1}", "EntityCode", "EntityNameDesc");

тогда

ddlPrimaryCarrier.DataTextField = "newField";

Как правильно это сделать? Могу ли я перебрать существующую коллекцию и создать новый список анонимных типов с нужным мне полем? У кого-нибудь есть примеры, как это сделать?

Спасибо, ~ ck в Сан-Диего

Ответы [ 2 ]

1 голос
/ 15 декабря 2009

Самый простой подход здесь - добавить свойство к типу. Если это сгенерировано (возможно, EF и т. Д.), Тогда используйте partial class:

namespace Whatever {
    partial class FinancialInstitution {
        public string EntityCaption {
            get {return "(" + EntityCode + ") - " + EntityNameDesc;
        }
    }
}

Если это DataTable, вы можете добавить вычисляемый столбец. Если этот тип находится вне вашего контроля, возможно сделать это (непосредственно для типа), используя собственный дескриптор типа (через TypeDescriptionProvider), но это очень сложно. Вместо этого я бы предпочел инкапсулировать экземпляр, добавив сквозные свойства, имитирующие инкапсулированный класс, и добавив новый:

class MyShim {
    private readonly FinancialInstitution inner;
    public MyShim(FinancialInstitution inner) {this.inner = inner;}
    public string EntityCode { get {return inner.EntityCode;}}
    public string EntityNameDesc { get {return inner.EntityNameDesc;}}
    public string EntityCaption {
        get {return "(" + EntityCode + ") - " + EntityNameDesc;
    }
}

и вместо этого связывайтесь с прокладками.

0 голосов
/ 15 декабря 2009

Предполагая, что FinancialInstitutions является коллекцией FinancialInstitution объектов, добавьте новое свойство в свой класс FinancialInstitution:

public string DisplayName
{
    get { return string.Format("({0}) - {1}", EntityCode, EntityNameDesc);
}

Если это DataTable, вы можете добавить вычисляемый столбец:

FinancialInstitutions.Columns.Add("DisplayName", typeof(string), "'(' + EntityCode + ') - ' + EntityNameDesc");

В обоих случаях установите ComboBox s DisplayMember на «DisplayName»

...