`
hugh-lin
  • 浏览: 72947 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

[转]Datagridview 实现二维表头

阅读更多
最近把我们的b/s系统,增加智能客户端的功能。确实智能客户端是非常好用的东西。可惜winform的控件功能不怎么强大,相比vb差很多啊。比如DataGridView不支持二维表头,不支持表尾合计,相比之下 web的好办多了(还是喜欢Web的排版、导航,但喜欢Win的操作性,希望WPF早日流行)。

       但是 MIS系统没有二维表头确实是客户不能接受的,尝试了com控件flexgrid或者开源的SourceGrid3,但都不怎么好用,于是想改造一下DataGridView。我的做法是在CellPainting做手脚。花了一天时间尝试,只是做出原型,还没有完善,希望有需要的朋友少走弯路。

  1,继承DataGridView,添加表头信息类。
  2,添加CellPainting,代码如下:
  private void DataGridViewEx_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        
{
            
if (e.RowIndex == -1)
            
{
             
//   int w = dataGridView1.HorizontalScrollingOffset + dataGridView1.TopLeftHeaderCell.Size.Width + dataGridView1.Columns[0].Width + 10;


                Rectangle newRect 
= new Rectangle(e.CellBounds.X + 1,
               e.CellBounds.Y 
+ 1, e.CellBounds.Width - 4,
               e.CellBounds.Height 
- 4);

                
using (
                    Brush gridBrush 
= new SolidBrush(this.GridColor),
                    backColorBrush 
= new SolidBrush(e.CellStyle.BackColor))
                
{
                    
using (Pen gridLinePen = new Pen(gridBrush))
                    
{
                        
// Erase the cell.
                        e.Graphics.FillRectangle(backColorBrush, e.CellBounds);

                        
// Draw the grid lines (only the right and bottom lines;
                        
// DataGridView takes care of the others).
                        e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left,
                            e.CellBounds.Bottom 
- 1, e.CellBounds.Right - 1,
                            e.CellBounds.Bottom 
- 1);
                        
if (e.ColumnIndex > -1 && topRow!=null&&topRow.Cells[e.ColumnIndex].ColSpan>1)
                        
{
                            e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right 
- 1,
                                e.CellBounds.Top 
+ e.ClipBounds.Height / 2, e.CellBounds.Right - 1,
                                e.CellBounds.Bottom);
                        }

                        
else
                        
{
                            e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right 
- 1,
                                                          e.CellBounds.Top, e.CellBounds.Right 
- 1,
                                                          e.CellBounds.Bottom);
                        }


                        
// Draw the inset highlight box.
                        
//   e.Graphics.DrawRectangle(Pens.Blue, newRect);

                        
int scale = e.CellBounds.Height/3;
                        
if (e.ColumnIndex > -1 && topRow.Cells[e.ColumnIndex].Text != null)
                        
{
                            scale
= e.CellBounds.Height / 2;
                            e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left, e.CellBounds.Bottom 
- e.CellBounds.Height / 2, e.CellBounds.Right, e.CellBounds.Bottom - e.CellBounds.Height / 2);
                        }

                        
// Draw the text content of the cell, ignoring alignment.

                      

                        
if (e.Value != null)
                        
{
                            e.Graphics.DrawString(e.Value.ToString(), e.CellStyle.Font,
                                Brushes.Crimson, e.CellBounds.X 
+ 2,
                                e.CellBounds.Y 
+ scale+ 2, StringFormat.GenericDefault);



                        }





                        
if (e.ColumnIndex > -1 &&  topRow.Cells[e.ColumnIndex].RelateIndex > -1 && topRow.Cells[e.ColumnIndex].Text!=null)
                    
                        
{
                            Rectangle recCell 
= new Rectangle(e.CellBounds.X - 1 - topRow.Cells[e.ColumnIndex].SpanRowWith,
           e.CellBounds.Y 
+ 1, topRow.Cells[e.ColumnIndex].SpanRowWith,
           e.CellBounds.Height 
/ 2);


                            StringFormat sf 
= new StringFormat();

                            sf.Alignment 
= StringAlignment.Center;


                            e.Graphics.DrawString(topRow.Cells[e.ColumnIndex].Text, e.CellStyle.Font, Brushes.Crimson, recCell, sf);

                        }

               
                        e.Handled 
= true;
                    }

                }

            }


        }

3,调用方法
  dataGridViewEx1.TopRow.Cells[2].Text = "入库";
            dataGridViewEx1.TopRow.Cells[
2].ColSpan = 2;


            dataGridViewEx1.TopRow.Cells[
4].Text = "出库";
            dataGridViewEx1.TopRow.Cells[
4].ColSpan = 2;
4,效果图


至于表尾合计,也做出了原型。二维表头+表尾合计,基本上满足需求了。
分享到:
评论

相关推荐

    C#实现DataGridView二维表头与合计栏

    在.NET框架中,C#是一种常用的编程...总的来说,实现C#的DataGridView二维表头和合计栏是一个涉及数据展示、用户交互和界面设计多方面技术的问题。通过理解并运用上述知识,开发者能够创建出高效且易用的数据展示界面。

    DataGridView单元格合并和DataGridView二维表头

    本示例和源码着重介绍了如何实现`DataGridView`单元格的行合并以及创建二维表头,这两种特性能帮助开发者更好地展示复杂的数据结构。 ### DataGridView单元格合并 单元格合并在`DataGridView`中通常是为了解决数据...

    C# datagridview二维表头

    在本主题中,我们将深入探讨如何实现"C# datagridview二维表头"以及"datagridview单元格合并"的相关技术。 一、二维表头(多级表头) 在传统的`DataGridView`中,表头通常是一维的,即每个列只有一个标题。然而,...

    DataGridView二维表头

    标题“DataGridView二维表头”正是针对这种需求,它允许我们在表头中嵌套额外的层次,帮助用户更好地理解和导航多维度的数据。 **一、什么是二维表头** 二维表头是指在常规的单级表头基础上增加了一层或更多层的...

    DataGridView多层表头-二维表头

    本篇文章将深入探讨如何在C#中实现`DataGridView`的二维表头功能,以及如何进行表头的合并单元格操作。 首先,我们需要了解`DataGridView`的基本用法。它允许我们动态地添加列和行,设置列的宽度,调整行的样式等。...

    DataGridView二维表头与合并单元格

    实现DataGridView二维表头和合并单元格需要继承自DataGridView类,定义私有变量和属性,实现构造函数,设置列高度显示模式,实现合并单元格和二维表头等。 在实际开发中,我们可以根据需要自定义DataGridView控件,...

    DataGridView 控件扩展 实现二维表头

    DataGridView 控件不能实现二维表头,这里对该控件进行扩展,该代码主要部分来自网络,自己在里面进行了一些修改,增加了一些事件操作。 该资源包含两个小项目,一为控件扩展源码,另一个为示例源码,以便大家更容易...

    DataGridView单元格合并和二维表头_datagridview_

    本教程将详细讲解如何实现`DataGridView`单元格的合并以及创建二维表头。 一、DataGridView单元格合并 在`DataGridView`中,单元格合并通常用于创建具有复杂布局的表格,比如合并相同值的行或列,或者创建跨多行的...

    DataGridview做的二维表头 合并单元格

    本篇将详细讲解如何在`DataGridView`中实现这种功能,特别关注“二维表头”和“合并单元格”的实现。 首先,二维表头是指在表格的第一行或第一列中,存在多级分类的表头。这通常是通过合并多个相邻的单元格来实现的...

    DATAGRIDVIEW实现双表头及合计栏

    - **DataGridView**是Windows Forms应用程序中用于显示二维表格数据的控件。 - 它具有强大的数据绑定能力,并支持多种编辑模式。 - 默认情况下,DataGridView提供单层表头,即每一列有一个标题。 **自定义...

    DataGridView二维表头及单元格合并

    本主题将深入探讨如何实现"二维表头"以及"单元格合并"的功能,这两个特性对于创建复杂的、结构化的数据展示至关重要。 一、二维表头 二维表头是指在传统的单层表头基础上增加了一层或多层水平或垂直的分类,能够更...

    C# DataGridView单元格合并和二维表头示例

    本示例将深入探讨如何在C#中实现`DataGridView`的单元格合并以及创建二维表头,这对于创建复杂的、层次化的数据展示非常有用。 首先,我们来理解`DataGridView`单元格合并的概念。在默认情况下,`DataGridView`的每...

    DataGridView二维表头和合并单元格

    通过以上方法,我们可以为`DataGridView`创建复杂的二维表头和实现单元格的合并。这不仅提升了界面的用户体验,也使得数据的组织和理解更加直观。在实际项目中,根据具体需求,可能还需要进一步优化性能和处理各种...

    DataGridView单元格合并和二维表头

    本篇将详细探讨`DataGridView`控件的两个高级特性:单元格合并与二维表头的实现,帮助开发者深入理解其精髓。 一、DataGridView单元格合并 在某些情况下,我们可能需要合并`DataGridView`中的单元格以展示更复杂的...

    DataGridView单元格合并和二维表头.rar

    本教程将深入探讨如何在`DataGridView`中实现单元格的合并以及创建复杂的二维表头。 一、DataGridView单元格合并 在`DataGridView`中,单元格合并通常用于创建具有跨行或跨列的标题,使得表格布局更加清晰和美观。...

    DataGridView单元格合并和二维表头能满足你的使用.rar

    DataGridView单元格合并和二维表头能满足你的使用

    vb.net2008 winform DataGridView单元格合并和二维表头

    在某些场合,我们可能需要对`DataGridView`的单元格进行合并或者创建二维表头,以实现更复杂的布局和展示效果。下面我们将详细探讨这两个主题。 一、DataGridView单元格合并 单元格合并通常用于创建具有复杂格式的...

    vb.netDataGridView单元格合并和二维表头

    在VB.NET编程中,`DataGridView`控件是一个非常重要的组件,...通过阅读和学习这些资源,你可以更好地掌握如何在VB.NET的`DataGridView`中实现单元格合并和二维表头的功能,从而提升你的程序界面的专业性和用户体验。

Global site tag (gtag.js) - Google Analytics