如何在 datagridview 中为单元格创建页脚

Posted

技术标签:

【中文标题】如何在 datagridview 中为单元格创建页脚【英文标题】:How can I create a footer for cell in datagridview 【发布时间】:2015-07-25 13:27:09 【问题描述】:

我需要创建一个包含两个部分的单元格的 DataGridView。一部分是该单元格的内容,例如 0、1 等值。而剩下的部分就是那个单元格的页脚,就像一个word文档的页脚,指的是那个单元格的序号。

我不能附上任何图片,所以问题可能不明确。

无论如何提前谢谢。

【问题讨论】:

请告诉我们你到目前为止做了什么。 使用列表视图。否则您必须自定义 datagridview 并添加可以从 listview 复制的页脚功能。 你看过我的回答广告了吗?看起来像你想做的吗? 【参考方案1】:

要创建具有额外内容的DataGridView 单元格,您需要编写CellPainting 事件。

首先,您将单元格设置为有足够的空间容纳额外的内容并根据需要布置正常内容..:

DataGridView DGV = dataGridView1;  // quick reference

Font fatFont = new Font("Arial Black", 22f);
DGV .DefaultCellStyle.Font = fatFont;
DGV .RowTemplate.Height = 70;
DGV .DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopCenter;

接下来我填写一些内容;我将额外的内容添加到单元格的Tags。对于具有更多字体等的更复杂的事物,您将需要创建一个类或结构来保存它,也许也在Tags..

DGV.Rows.Clear();
DGV.Rows.Add(3);

DGV[1, 0].Value = "Na"; DGV[1, 0].Tag = "Natrium";
DGV[1, 1].Value = "Fe"; DGV[1, 1].Tag = "Ferrum";
DGV[1, 2].Value = "Au"; DGV[1, 2].Tag = "Aurum";

下面是编码CellPainting事件的示例:

private void dataGridView1_CellPainting(object sender, 
               DataGridViewCellPaintingEventArgs e)

    if (e.RowIndex < 0) return;  // header? nothing to do!
    if (e.ColumnIndex == yourAnnotatedColumnIndex )
    
        DataGridViewCell cell = dataGridView1[e.ColumnIndex, e.RowIndex];
        string footnote = "";
        if (cell.Tag != null) footnote = cell.Tag.ToString();

        int y = e.CellBounds.Bottom - 15;  // pick your  font height

        e.PaintBackground(e.ClipBounds, true); // show selection? why not..
        e.PaintContent(e.ClipBounds);          // normal content
        using (Font smallFont = new Font("Times", 8f))
            e.Graphics.DrawString(footnote, smallFont,
              cell.Selected ? Brushes.White : Brushes.Black, e.CellBounds.Left, y);

        e.Handled = true;
    

对于更长的多行脚注,您可以使用边界 Rectangle 而不仅仅是 x&y 坐标..

【讨论】:

对其他模棱两可的问题的可靠回答。干得好 谢谢你 TaW 我明白了。抱歉没有回复我最近很忙。 DataGridView DGV = dataGridView2; 应该是 2 还是 1?谢谢。 这个答案简直太棒了。另外,e.PaintContent(e.ClipBounds); 的意义何在?当我删除它时,我会得到相同的结果。 会不会是你没有任何“正常”的内容?

以上是关于如何在 datagridview 中为单元格创建页脚的主要内容,如果未能解决你的问题,请参考以下文章

datagridview 将单元​​格样式应用于单元格

如何在同一个datagridview中多次使用定义的datagridview单元格

C# 如何使datagridview中的单元格处于可编辑

如何让datagridview单元格只能输入数字 C#

Datagridview:如何在编辑模式下设置单元格?

DataGridView:如何使某些单元格无法选择?