在单个DataGridView单元格中显示数据表内容?

时间:2013-10-20 05:53:16

标签: c#

假设我有两个数据表:

- 在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 '
'---------'---------------'

1 个答案:

答案 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,上面的代码会略有不同,因为您将有直接方法来访问父行中的子数据。