有没有办法让 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.
我正在尝试将记录中的 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 theDataGridView
control when you need more control over the layout of the data. TheDataRepeater
"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.