Привязка объекта с подобъектами в качестве свойств к datagrid

StackOverflow https://stackoverflow.com/questions/407180

Вопрос

Я работаю с объектом, внутри которого есть вложенные объекты (см. Пример ниже).Я пытаюсь связать List<rootClass> к сетке данных.Когда я свяжу List<>, в ячейке , которая содержит subObject, я вижу следующее значение ... "namespace.subObject" ... строковые значения отображаются корректно.

В идеале я хотел бы видеть свойство “Description” для subObject в ячейке данных.Как я могу сопоставить subObject.Description чтобы показать в ячейке данных?

public class subObject
{
   int id;
   string description;

   public string Description
   { get { return description; } }
}

public class rootClass
{
   string value1;
   subObject value2;
   string value3;

   public string Value1
   { get { return value1; } }

   public subObject Value2
   { get { return value2; } }

   public string Value3
   { get { return value3; } }
}
Это было полезно?

Решение

Если я не ошибаюсь, он показывает результат вызова .toString() для вашего подобъекта, так что вы можете переопределить это, чтобы вернуть содержимое Description .

Вы пробовали просто привязываться к Значению1.Описание?(Я предполагаю, что это не сработает).

У меня есть класс, который можно использовать вместо List при привязке, который будет обрабатывать это, он реализует ITypedList, который позволяет коллекции предоставлять больше "свойств" для своих объектов, включая вычисляемые свойства.

Последняя версия файлов, которые у меня есть, находится здесь:

https://gist.github.com/lassevk/64ecea836116882a5d59b0f235858044

Для использования:

List<rootClass> yourList = ...
TypedListWrapper<rootClass> bindableList = new TypedListWrapper<rootClass>(yourList);
bindableList.BindableProperties = "Value1;Value2.Description;Value3.Description";
gridView1.DataSource = bindableList;

По сути, вы привязываетесь к экземпляру TypedList<T> вместо того, чтобы List<T>, и настройте свойство BindableProperties.У меня есть некоторые изменения в работе, в том числе одно, которое просто автоматически создает BindableProperties по ходу работы, но оно еще не в магистрали.

Вы также можете добавить вычисляемые свойства, например, следующим образом:

yourList.AddCalculatedProperty<Int32>("DescriptionLength",
    delegate(rootClass rc)
    {
        return rc.Value2.Description.Length;
    });

или с .NET 3.5:

yourList.AddCalculatedProperty<Int32>("DescriptionLength",
    rc => rc.Value2.Description.Length);

Другие советы

Раз уж вы упомянули DataGridViewColumn (теги), я полагаю, вы имеете в виду winforms.

Доступ к вложенным свойствам - это боль;валютный менеджер привязан к списку, поэтому по умолчанию у вас есть доступ только к непосредственным свойствам;однако вы можете пройти мимо этого если вам абсолютно необходимо используя пользовательский дескриптор типа.Вам также нужно было бы использовать другой токен, например "Foo_Bar" вместо "Foo.Bar".Тем не менее, это майор объем работы, требующий знания PropertyDescriptor, ICustomTypeDescriptor и , вероятно , TypeDescriptionProvider, и почти наверняка оно того не стоит,

Самое простое исправление - предоставить свойство в виде прокладки / сквозного доступа:

public string Value2Description {
    get {return Value2.Description;} // maybe a null check too
}

Затем привяжите к "Value2Description" и т.д.

Я не уверен, используете ли вы ASP.NET, но если да, то вы можете использовать столбец шаблона и метод Eval() для отображения значений вложенных объектов.Например.для отображения свойства Описания подобъекта:

<asp:GridView ID="grid" runat="server" AutoGenerateColumns="true">
  <Columns>
    <asp:TemplateField>
      <ItemTemplate>
        <asp:Literal Text='<%# Eval("Value2.Description") %>' runat="server" />
      </ItemTemplate>
    </asp:TemplateField>
  </Columns>
</asp:GridView>

Не уверен, что вам нужно что-то подобное...

Вы могли бы написать такой метод, как:

protected string getSubObject(object o)
{
    string result = string.empty;

    try
    {
        result = ((subObject)o).Description;
    }
    catch
    { /*Do something here to handle/log your exception*/ } 

    return result;
}

Затем привяжите объект примерно так:

<asp:Literal Text='<%# getSubObject(Eval("Value2")) %>' runat="server" />
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top