繁体   English   中英

如何在 DataGridView (C#) 中配置数据

[英]How to configure data in DataGridView (C#)

我有 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() 但我希望它单独显示类别的属性。

如果我理解正确,您只需要将正确的属性绑定到 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>

希望它会帮助你!

不幸的是, DataGridView不会知道如何处理“类”中的“类”。 如果将“List”作为“设备”类的属性,则应用相同的想法。 网格将把类/列表解释为“多个”对象,它不会将这些对象“解析”到单独的列中。 第三方网格可能会这样做。

我不会争辩说,如果 Class 只有单个非集合类型的对象,它会进行这种简单的解析……不幸的是,开箱即用的DataGridView不会为您执行此操作。 您的代码将不得不“扁平化”数据以使其全部显示在网格中。

正如您所评论的,一个简单的解决方法是覆盖 Category 的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属性。 例如,如果你使Device类的Category属性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将是一种更好的方法,但是如前所述,由于只有两个字段,因此上述解决方案应该有效。

希望这是有道理的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM