有没有办法让 WinForms DataGridView 的列显示记录中的多个值

Is there a way to have a WinForms DataGridView with a column displaying multiple values from a record

我正在尝试将记录中的 2 个或 3 个值显示到 DataGridView 的单个单元格行中。下面是一个 class 表示要数据绑定到的记录:

Class Book
{
  public int BookId {get;set;}
  public string Title {get;set;}
  public string Publisher {get;set}
  public string Author {get;set}
  public Date CopyrightDate {get;set}
  public byte[] BookCoverImage {get;set}
}

我想要一个如下所示的网格:

我只想了解如何创建标题为摘要信息的第二列。我一直想知道是否有办法从数据绑定源显示摘要列中的信息。现在我在各自的列中显示每个信息,但希望单个单元格中有多个值,如示例图片所示。如果这可以在 WinForms DataGridView 中完成(或者我应该使用另一个控件?)有人可以提供有关如何完成此操作的信息或 link 信息吗?提前致谢。

假设您有 dataGridView1 并且您想要显示问题图像中显示的数据。您可以执行如下操作。

这里我们使用“\n”在单元格的值中添加新行,DefaultCellStyle.WrapMode 将负责将数据正确地放入新行。

您需要根据内容设置可调整大小的列。

List<Book> bookList = new List<Book>();
for(int i = 0; i < 3; i++)
{
    //for simplicity of solution, i have used cover as string not image,
    // you can perform same logic with cover as image too.
    bookList.Add(new Book(i, "title" + i, "publisher" + i, "auther" + i, "cover" + i));
}

DataTable dt = new DataTable();
dt.Columns.Add("ColBook");
dt.Columns.Add("ColData");

foreach(Book book in bookList)
{
    DataRow dr = dt.NewRow();
    dr["ColBook"] = book.BookCoverImage;
    dr["ColData"] = "Title:"+book.Title + "\nPublisher:" + book.Publisher + "\nAuthor:" + book.Author;
    dt.Rows.Add(dr);
}

dataGridView1.DataSource = dt;
dataGridView1.Columns[1].DefaultCellStyle.WrapMode = DataGridViewTriState.True;
dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

您可以使用以下任一解决方案:

  • 将只读摘要 属性 添加到 class 并使用绑定列。
  • 使用 CellFormatting 事件为未绑定的列提供值。
  • 使用 CellPainting 事件自定义绘制绑定或未绑定单元格的内容。
  • 使用DataRepeater控件。

选项 1 - 添加摘要 属性

您可以添加一个新的 Summary 属性,其中包含您要在单元格中显示的信息:

Class Book
{
    // rest of properties ...
    public string Summary
    {
        get 
        {
            return
                $"Title: {this.Title}\n" +
                $"Author: {this.Author}\n" +
                $"Copyright Date: {this.CopyrightDate}";
        }
    }
}

然后您可以简单地使用绑定列来显示 DataGridView 中的数据。

注1:如果模型是自动生成的,可以将新的属性放在局部class.

注2:在使用DataTable的情况下,您可以通过为列设置表达式来简单地创建一个公式列。

选项 2 - 单元格格式

您可以添加一个未绑定的列,并在运行时在 DataGridView 控件的 CellFormatting 事件中简单地提供单元格的值:

private void dgv_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    var dgv = (DataGridView)sender;
    if (e.RowIndex < 0 || e.RowIndex == dgv.NewRowIndex)
        return;
    if (e.ColumnIndex == 1 /*The column index which you want to format*/)
    {
        var book = dgv.Rows[e.RowIndex].DataBoundItem as Book;
        if (book != null)
            e.Value =
                $"Title: {book.Title}\n" +
                $"Author: {book.Author}\n" +
                $"Copyright Date: {book.CopyrightDate}";
    }
}

选项 3 - 使用 CellPaintig 事件自定义绘制单元格

您可以在此 post 中看到使用不同字体绘制单元格内容的示例:

选项 4 - 使用 DataRepeater 控件

您可以使用 DataRepeater 控件。

The Visual Basic Power Packs DataRepeater control is a scrollable. container for controls that display repeated data, for example, rows in a database table. It can be used as an alternative to the DataGridView control when you need more control over the layout of the data. The DataRepeater "repeats" a group of related controls by creating multiple instances in a scrolling view. This enables users to view several records at the same time.