假设我有两个数据表:
- 在First Datatable orders
中,我检索了我的订单列表,例如
---------------------------
'order_id ' order '
'---------'---------------'
' 1 ' order details'
'---------'---------------'
' 2 ' order details'
'---------'---------------'
' 3 ' order details'
'---------'---------------'
' 1 ' order details'
'---------'---------------'
- 在第二个数据表order_details
中,我检索每个订单的详细信息(如客户,订单价值等)
--------------------------------
'order_id'customer'order_val'...'
'--------'--------'---------'---'
'order_id' Cust1 ' Value11 '...'
'--------'--------'---------'---'
'order_id' Cust2 ' Value21 '...'
'--------'--------'---------'---'
我的问题:
可以创建(如缩略图)第二个数据表并在datagridview
单元格中插入多少(即替换上表中显示的“订单详细信息”)?!
---------------------------
'order_id ' order '
'---------'---------------'
' 1 ' Cust1 Value11 '
'---------'---------------'
' 2 ' Cust2 Value21 '
'---------'---------------'
答案 0 :(得分:2)
这一点都不难。您需要使用CellPainting
类绘图方法(例如Graphics
)收听DrawString
事件并在该单元格内绘制内容。您可能面临的一个问题是,您显然需要消耗最少的屏幕空间,因此您可能需要ScaleTransform
或以其他方式最小化您想要显示的内容量。
e.RowIndex
将允许您访问基础DataRow
,然后您可以使用它来访问需要绘制的子行/ DataTable。 e.ColumnIndex
可用于确定将显示表内容的正确列。 e.Graphics
是实际的Graphics
对象,可让您绘制内容。 e.CellBounds
将为您提供绘图区域的大小和位置。
以下是CellPainting
事件的最小示例:
private void dgv_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
var dgv = (DataGridView)sender;
//Get the order row
var row = ((DataRowView)dgv.Rows[e.RowIndex].DataBoundItem).Row;
//Get child rows of your order row
var OrdDetails = row.GetChildRows("rel_Order_OrderDetails");
//An example of how information from one of these child rows can be drawn inside the cell
e.Graphics.DrawString(OrdDetails[0]["CustomerName"], dgv.Font, Brushes.Black, e.CellBounds.Location);
}
如果您使用强类型DataSet,上面的代码会略有不同,因为您将有直接方法来访问父行中的子数据。