在单个数据网格视图单元格中显示数据表内容

本文关键字:显示 数据表 单元格 视图 单个 数据 数据网 网格 | 更新日期: 2023-09-27 18:36:02

假设我有两个数据表:

-在第一个数据表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 '
'---------'---------------'

在单个数据网格视图单元格中显示数据表内容

一点也不难。您需要收听CellPainting事件并使用DrawString等类绘制方法在该单元格内Graphics内容。您可能面临的一个问题是,您显然需要消耗的屏幕空间最少,因此您可能需要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);
}

如果您使用的是强类型数据集,则上面的代码会略有不同,因为您将有直接方法来访问父行中的子数据。