Как настроить данные в DataGridView (C#) - PullRequest
0 голосов
/ 16 марта 2020

У меня есть DataGridView, который как для DataSource список устройств. Устройство имеет категорию, и я хотел бы знать, как отобразить в DataGridView свойства категории (на данный момент оно использует ToString () для ее отображения).

public class Device
{
    public int Id { get; }
    public string Name { get; set; }
    public Category Category {get; set; }
}

public class Category
{
    public int Id { get; }
    public string Name { get; }
}

В моей форме:

List<Device> devices = (...); //load my devices
myDataGridView.DataSource = devices;

Таким образом, в моем DataGridView будет отображаться Category.ToString (), но я бы хотел, чтобы он отображал отдельно свойства категории.

Ответы [ 2 ]

0 голосов
/ 17 марта 2020

К сожалению, DataGridView не будет знать, что делать с «Классом» в «Классе». Та же идея применяется, если в качестве свойства класса «Device» был «List». Сетка будет интерпретировать класс / список как «множественные» объекты и не будет «разбирать» эти объекты на отдельные столбцы. Возможно, сторонняя сетка может сделать это.

Я не буду утверждать, что если у Класса есть только одни объекты, не относящиеся к типу коллекции, он будет выполнять этот простой анализ ... к сожалению, из коробки DataGridView выиграл не делай этого для тебя. Ваш код должен будет «сгладить» данные, чтобы все они отображались в сетке.

Как вы прокомментировали, простое исправление состоит в том, чтобы переопределить метод ToString категории, чтобы получить строку с «обоими Значения объединены. Это вернет данные, но, как вы заметили, «оба» значения будут находиться в «одном столбце».

public class Category {

  public int Id { get; }
  public string Name { get; }

  public Category(int id, string name) {
    Id = id;
    Name = name;
  }

  public override string ToString() {
    return Id + ", " + Name;
  }
}

Учитывая это, я думаю, что будет проще написать метод «сгладить» данные и вернуть DataTable со всеми полями. Однако, учитывая, что имеется только два (2) поля, класс Device может также иметь свойства Category. Например, если вы зададите свойство Category класса Device private, то откроете два свойства Cataegory в классе Device. Что-то вроде….

class Device {

  public int Id { get; }
  public string Name { get; set; }
  private Category _Category { get; set; }

  public Device(int id, string name, Category category) {
    Id = id;
    Name = name;
    _Category = category;
  }

  public int CatID {
    get {
      return _Category.Id;
    }
  }

  public string CatName {
    get {
      return _Category.Name;
    }
  }
}

Я держу пари, что выделенный метод «сгладит» данные и вернет DataTable будет лучшим подходом, как уже упоминалось, так как есть только два поля, выше решение должно работать.

Надеюсь, что имеет смысл.

0 голосов
/ 16 марта 2020

Если я правильно понимаю, вам просто нужно связать правильное свойство в XAML. Для простого примера, если список определен как DataSource:

<DataGrid Name="yourName" AutoGenerateColumns="False">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Device ID " Binding="{Binding Id}" />
        <DataGridTextColumn Header="Device Name" Binding="{Binding Name}" />
        <DataGridTextColumn Header="Category ID" Binding="{Binding Category.Id}" />
        <DataGridTextColumn Header="Category Name" Binding="{Binding Category.Name}" />
    </DataGrid.Columns>
</DataGrid>

Надеюсь, он вам поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...