Foxtable(狐表)用户栏目专家坐堂 → 数据表滚动条上方增加统计行


  共有16187人关注过本帖树形打印复制链接

主题:数据表滚动条上方增加统计行

帅哥哟,离线,有人找我吗?
明丰
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:558 积分:4352 威望:0 精华:2 注册:2011/4/18 8:27:00
数据表滚动条上方增加统计行  发帖心情 Post By:2011/11/11 20:24:00 [显示全部帖子]

数据表滚动条上方增加统计行,可以直接统计数值列,希望狐爸可以增加该功能.

[此贴子已经被作者于2011-11-11 20:27:33编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
明丰
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:558 积分:4352 威望:0 精华:2 注册:2011/4/18 8:27:00
  发帖心情 Post By:2011/11/12 7:37:00 [显示全部帖子]

参考几款进销存软件,滚动条上方都有统计行功能, 

http://www.codeproject.com/kb/grid/summary_datagridview.aspx",该网址也有介绍.


此主题相关图片如下:统计行.jpg
按此在新窗口浏览图片

 回到顶部
帅哥哟,离线,有人找我吗?
明丰
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:558 积分:4352 威望:0 精华:2 注册:2011/4/18 8:27:00
  发帖心情 Post By:2011/11/12 8:33:00 [显示全部帖子]

没设置代码的空表?

 回到顶部
帅哥哟,离线,有人找我吗?
明丰
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:558 积分:4352 威望:0 精华:2 注册:2011/4/18 8:27:00
  发帖心情 Post By:2011/11/12 9:10:00 [显示全部帖子]

里面的代码在其它方面有用,谢谢!

但是真正要达到效果还是要增加上面提到的功能,即统计行位于滚动条上方,有点象表头,不是临时表.(我是这样理解的)


 回到顶部
帅哥哟,离线,有人找我吗?
明丰
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:558 积分:4352 威望:0 精华:2 注册:2011/4/18 8:27:00
  发帖心情 Post By:2011/11/12 9:41:00 [显示全部帖子]

下面是参考文章,能设置类似代码吗?

 

 

DataGridView底部实现统计行


此主题相关图片如下:图1.jpg
按此在新窗口浏览图片

  在开发一个基于Window FormCS应用程序的时候,我搜索过一个这样的DataGridView 控件,它能显示一列内容的总和。例如:统计顾客订单的总数,显示在Grid中的一列上。就像Excel能做的一样,我没有找到一个合适的解决方案,所以我决定自己开发一个组件。它能像DataGridView一样工作,能在表格的底部显示一行。

  为了SummaryRow的重新定位和大小的调整,我重构了一些代码,代码借用了Robert Rhode写的Nice Filterable DataGrid

  为了能运行SummaryDataGridViewTest-Application ,必要将Nwind.mdb 数据库拷贝到输出路径下面。

  非常好的DataGridViewWindow-Forms类库的知识有助于你定制代码,但是它不是必要的。因为使用SummaryDataGridView 非常的简单。

  SummaryDataGridView 能像任何其他Windows-Forms 控件一样使用。支持设计时的设定。在设计上,它有一组公共属性。使用类似DataGridView ,因为它是继承了DataGridView。为了显示数据,需要设置控件的DataSource 属性。每一列必须添加到字符串数组SummaryColumns中。看图1和图2的公有属性,看他们是如何影响SummaryDataGridView的。


此主题相关图片如下:图2.jpg
按此在新窗口浏览图片

SummaryRow

  使用DataGridView 的一行作为总结行是一件非常棘手的事情,会带来很多问题。我没有找到在表格的底部固定SummaryRow的解决方案,它又必须是滚动的。由于这个原因,我使用一个带Textboxe的简单控件,它显示在DataGridView的下面。所有的textboxDataGridView一起改变自己的大小。此外它必须利用自己的水平滚动条将显示在我们的SummaryControlContainer下面,而不是使用显示在SummaryRow上面的 DataGridView的水平滚动条。因此有相当一部分的代码是处理SummaryRow的定位、大小、排序的。总结一行的值是控件中最容易实现的部分。下面的DataGridView事件的处理是为了使DataGridViewSummaryRow同步:

  ColumnAdded, ColumnRemoved, ColumnStateChanged, ColumnDisplayIndexChanged

  为了了解更多的关于同步的信息,看这些方法:SummaryControlContainer 类的reCreateSumBoxes() resizeSumBoxes() 方法

  SummaryRow DataGridView粘合:

  如何将SummaryRow 附加到DataGridView上面。最简单的方式是使用一个控件将SummaryRow DataGridView包含在其中。通过一个公共属性在表格之间访问。我决定让DataGridView创建自己的SummaryRow。为了避免设计时出现的问题,我们在运行时完成。在DataGridView 初始化之后,调用 ChangeParent() 方法。这个方法从父控件移除DataGridView ,在这个地方创建一个panel,然后在这个panel中包含DataGridView SummaryRow 。在移除DataGridView之前,我们必须在TableLayoutPanel上确定确切位置。

       private void changeParent()
       {
           if (!DesignMode && Parent != null)
          {
             [..]
               panel.Bounds = this.Bounds;
               panel.BackColor = this.BackgroundColor;                                     
               panel.Dock = this.Dock;
               [..]
               summaryControl.Dock = DockStyle.Bottom;
               this.Dock = DockStyle.Fill;                
   
   Special handling for TableLayoutPanels
            if (this.Parent is TableLayoutPanel)
            {
                int rowSpan, colSpan;
                TableLayoutPanel tlp = this.Parent as TableLayoutPanel;                   
                TableLayoutPanelCellPosition cellPos = 
                tlp.GetCellPosition(this);
                rowSpan = tlp.GetRowSpan(this);
                colSpan = tlp.GetColumnSpan(this);
                tlp.Controls.Remove(this);
                tlp.Controls.Add(panel, cellPos.Column, cellPos.Row);
                tlp.SetRowSpan(panel, rowSpan);
                tlp.SetColumnSpan(panel, colSpan);
              }
              else
              {
                  Control parent = this.Parent;
                  remove DataGridView from ParentControls
                  parent.Controls.Remove(this);
                  parent.Controls.Add(panel);                    
              }
              summaryControl.Controls.Add(hScrollBar);
              hScrollBar.BringToFront();
              panel.Controls.Add(this);
              panel.Controls.Add(summaryControl);
              adjustSumControlToGrid();
              adjustScrollbarToSummaryControl();
              resizeHScrollBar();                
          }
      }

只读的TextBox

  一个标准的Windows窗体TextBox,使其ReadOnly属性设置为true 主要问题是,认为该文本框颜色更改为Caption(),不能设置其他的颜色。我想让SummaryRow 的背景颜色是纯白色。这就是为什么我要包括我自己的TextBox。这是一个简单的控件,因为在TextBox中没有EventHandlingTextBox能获得IsSummary属性来表明是否用来合总。直接在OnPaint事件中绘制控件。

   protected override void OnPaint(PaintEventArgs e)
   {         
       Rectangle textBounds;
       textBounds = new Rectangle(this.ClientRectangle.X + 2, this.ClientRectangle.Y + 2,
           this.ClientRectangle.Width - 2, this.ClientRectangle.Height - 2);
       using (Pen pen = new Pen(borderColor))
       {
          e.Graphics.FillRectangle(new SolidBrush(this.BackColor), this.ClientRectangle);
          e.Graphics.DrawRectangle(pen, this.ClientRectangle.X, this.ClientRectangle.Y,
              this.ClientRectangle.Width - subWidth, this.ClientRectangle.Height - 1);
          e.Graphics.DrawString(Text, Font, Brushes.Black, textBounds, format);
        }
   }

  在公共属性SumaryRowBackColor中设置SummaryRow的颜色

  实际是在calcSummaries()方法中统计列值,这个方法在 DataGridView [RowsAdded] [RowsRemoved] [CellValueChanged] 事件处理中调用。 它通过遍历DataGridView 的每一行在SummaryColumn上总计列值

  原文:http://www.codeproject.com/KB/grid/Summary_DataGridView.aspx




 回到顶部
帅哥哟,离线,有人找我吗?
明丰
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:558 积分:4352 威望:0 精华:2 注册:2011/4/18 8:27:00
[求助]后台编程我该如何学习,一头雾水,求大师指点一二;  发帖心情 Post By:2011/11/12 11:26:00 [显示全部帖子]

Table2中的列隐藏时,Table1对应的列也隐藏,显示时也跟着显示;

 

Table2中水平滚动条移动,Table1对应的列也跟随移动.(即列对齐)

 

Table1中增加1列,宽度与Table2序号列对应.

 

请问如何设置?

 

 

 

 

[此贴子已经被作者于2011-11-12 12:01:45编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
明丰
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:558 积分:4352 威望:0 精华:2 注册:2011/4/18 8:27:00
  发帖心情 Post By:2011/11/12 12:04:00 [显示全部帖子]

Table1中增加1列,宽度与Table2序号列对应.

 

请问如何设置?


 回到顶部
帅哥哟,离线,有人找我吗?
明丰
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:558 积分:4352 威望:0 精华:2 注册:2011/4/18 8:27:00
  发帖心情 Post By:2011/11/12 12:13:00 [显示全部帖子]

能只显示空格而不显示序号吗?

 回到顶部
帅哥哟,离线,有人找我吗?
明丰
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:558 积分:4352 威望:0 精华:2 注册:2011/4/18 8:27:00
  发帖心情 Post By:2011/11/13 9:06:00 [显示全部帖子]

'得到列名和类型
Dim t1 As Table = Tables("数据")
Dim zd As New Dictionary(Of Integer, String)
For Each dc As Col In t1.Cols
    If dc.IsNumeric And zd.ContainsValue(dc.name) = False Then
        zd.Add(dc.Index,dc.Name & "|Double" )
    End If
Next
For Each dc As Col In t1.Cols
    If dc.IsString And zd.ContainsValue(dc.name) = False Then
        zd.Add(dc.Index,dc.Name & "|String" )
    End If
Next
For Each dc As Col In t1.Cols
    If dc.IsDate And zd.ContainsValue(dc.name) = False Then
        zd.Add(dc.Index,dc.Name & "|Date")
    End If
Next
For Each dc As Col In t1.Cols
    If dc.IsBoolean And zd.ContainsValue(dc.name) = False Then
        zd.Add(dc.Index,dc.Name & "|Boolean")
    End If
Next
For k As Integer = 0 To zd.count -1
    output.show("列名:" & zd(k).SubString(0,(zd(k).IndexOf("|"))))
    output.show("类型:" & (zd(k).SubString((zd(k).IndexOf("|"))+1,(zd(k).length - 1 - zd(k).IndexOf("|")))))
Next

 

 

下面代码中的列名、类型替换成变量,请问如何设置?(临时表的Type不知如何定义变量)

 

 

Dim dtb As New DataTableBuilder("统计")
dtb.AddDef("产品", Gettype(String), 32)
dtb.AddDef("数值1", Gettype(Double))
dtb.AddDef("数值2", Gettype(Double))
dtb.AddDef("数值3", Gettype(Double))
Tables("窗口1_Table1").DataSource  = dtb.BuildDataSource
Tables("窗口1_Table1").AddNew()
Tables("窗口1_Table1").SetHeaderRowHeight(0)
Tables("窗口1_Table1").ExtendLastCol = True
Tables("数据").ExtendLastCol = True
For Each c As col In Tables("窗口1_Table1").Cols
    c.Width = Tables("数据").cols(c.name).Width
    Select Case c.name
        Case "数值1","数值2","数值3"
            Tables("窗口1_Table1").Current(c.name) = DataTables("数据").compute("Sum(" & c.name & ")")
    End Select
Next
'Tables("窗口1_Table1").Current("产品") = "合计"
DataTables("窗口1_Table1").SysStyles("Normal").BackColor = SystemColors.Control
Tables("窗口1_Table1").Grid.ScrollBars= Windows.Forms.ScrollBars.None

 

 


 回到顶部
帅哥哟,离线,有人找我吗?
明丰
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:二尾狐 帖子:558 积分:4352 威望:0 精华:2 注册:2011/4/18 8:27:00
  发帖心情 Post By:2011/11/13 11:42:00 [显示全部帖子]

老大看一下如何设置,谢谢!

 回到顶部
总数 12 1 2 下一页