【问题标题】:How to configure data in DataGridView (C#)如何在 DataGridView (C#) 中配置数据
【发布时间】:2020-03-16 10:07:39
【问题描述】:

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

【问题讨论】:

    标签: c# .net datagridview


    【解决方案1】:

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

    希望对你有帮助!

    【讨论】:

    • 对不起,我不明白你刚刚做了什么。我的项目中没有任何 XAML。这是我正在使用的 DataGridView。
    • 你如何显示你的数据呢?所以我会尝试找到另一个解决方案
    • 我只是设置了 myDataGridView.DataSource 属性,它自己完成了所有工作。
    • 实际上你需要自己生成你的列,这就是我的代码中禁用 AutoGenerateColumn 的原因。
    【解决方案2】:

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

    我不会争辩说,如果 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,则在Device 类中公开Cataegory 的两个属性。有点像……。

    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 会是更好的方法,但是如上所述,由于只有两个字段,因此上述解决方案应该可以工作。

    希望这是有道理的。

    【讨论】:

    • 谢谢。我会试着找到关于你所说的DataTable的一些东西
    猜你喜欢
    • 2013-03-26
    • 1970-01-01
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多