之前我们曾经提到过,您可以在Windows Form窗体上的一个DataGridView控件中一次显示出多个圆饼图(或其它形式的统计图表)以便能够一次检视多个群组数据的比例情况(如图表1所示)。当时并未列出原始程序代码,有读者希望能够提供原始程序代码,所以我们在此将其完整列出,与大家共享:(注:本程序范例将附于简体版的Visual C# 2005文件IO与资料存取秘诀」一书)

Option Strict On
Imports System.Data.SqlClient
Imports System.Drawing
Imports System.IO
Imports System.Drawing.Imaging
Public Class Form1

' 宣告各个私用变量。
  Private dirInfo As DirectoryInfo
  ' 此变量用来持有男女平均薪资的总和。
  Private TotalSalary As Long
  ' 此变量用来持有女性平均薪资。
  Private FemaleSalary As Long
  ' 此变量用来持有男性平均薪资。
  Private MaleSalary As Long
  ' 此变量用来持有女性空间之扇形区域之第二个边的角度。
  Private sweep As Single

Private Sub Form1_Load(ByVal sender As System.Object, _
      ByVal e As System.EventArgs) Handles MyBase.Load

    Dim myPieChartTable As New DataTable
    myPieChartTable.Columns.Add("部门", GetType(System.String))
    myPieChartTable.Columns.Add("图形", GetType(System.Byte()))

    ' 利用 SqlConnectionStringBuilder 对象来构建连接字符串。
    Dim connectStringBuilder As New SqlConnectionStringBuilder()
    connectStringBuilder.DataSource = "(local)\SQLEXPRESS"
    connectStringBuilder.InitialCatalog = "北风贸易"
    connectStringBuilder.IntegratedSecurity = True

Using cn1 As New SqlConnection(connectStringBuilder.ConnectionString)

Dim cmdDepartment As New SqlCommand( _
        "SELECT DISTINCT 部门FROM 章立民研究室", cn1)

cn1.Open()

Using dr1 As SqlDataReader = cmdDepartment.ExecuteReader

While dr1.Read

' 取得部门。            
          Dim strDepartment As String = dr1.GetSqlString(0).Value

Dim myTable As New DataTable

Using cn2 As New SqlConnection(connectStringBuilder.ConnectionString)

Dim cmdLiming As New SqlCommand( _
              "SELECT 性别, AVG(目前薪资) AS 平均薪资 FROM 章立民研究室 " & _
              "WHERE 部门= @department GROUP BY 性别ORDER BY 性别", cn2)
            cmdLiming.Parameters.Add( _
              "@department", SqlDbType.NVarChar, 10).Value = strDepartment

cn2.Open()

Using dr2 As SqlDataReader = cmdLiming.ExecuteReader()
              myTable.Load(dr2, LoadOption.OverwriteChanges)
            End Using

' 将男女平均薪资的总和指派给变数 TotalSalary。
            TotalSalary = CInt(myTable.Rows(0)(1)) + CInt(myTable.Rows(1)(1))

' 将女性平均薪资指派给变量 FemaleSalary。
            FemaleSalary = CInt(myTable.Rows(0)(1))

' 将男性平均薪资指派给变量 MaleSalary。
            MaleSalary = CInt(myTable.Rows(1)(1))

' 计算女性空间之扇形区域之第二个边的角度。
            sweep = CSng(360.0F * (FemaleSalary / TotalSalary))
          End Using

Using objBitmap As New Bitmap(300, 330)
            Using objGraphics As Graphics = Graphics.FromImage(objBitmap)
              objGraphics.Clear(Drawing.Color.White)

' 宣告 Rectangle 结构变量,并指定X 坐标参数、Y 坐标参数、
              ' 宽度参数、高度参数,用来显示圆饼图的矩形大小。
              Dim rect As Rectangle = New Rectangle(40, 10, 200, 200)

' 宣告 Rectangle 结构变量,并指定 X 坐标参数、Y 坐标参数、
              ' 宽度参数、高度参数,用来当作圆饼图边界的矩形大小。
              Dim rect2 As Rectangle = New Rectangle(0, 0, 290, 320)

' 宣告 Rectangle 结构变量,并指定 X 坐标参数、Y 坐标参数、宽度参数、
              ' 高度参数,用来当作已使用空间的图例。
              Dim MaleLegend As Rectangle = New Rectangle(5, 265, 20, 20)

' 宣告 Rectangle 结构变量,并指定 X 坐标参数、Y 坐标参数、宽度参数、
              ' 高度参数,用来当作未使用空间的图例。
              Dim FemaleLegend As Rectangle = New Rectangle(5, 290, 20, 20)

' 在画面上显示出矩形,并指定颜色参数与要显示的 Rectangle 参数。
              objGraphics.DrawRectangle(Pens.Black, rect2)

' 绘制 "男女平均薪资的总和:" 下方的水平线。
              objGraphics.DrawLine(Pens.Black, 0, 250, 290, 250)

' 在画面上显示圆饼图,并指定颜色参数、Rectangle 参数、圆饼图的
              ' 起点参数、以及圆饼图要涵盖的范围参数。
              objGraphics.FillPie(Brushes.Magenta, rect, 0, sweep)
              objGraphics.FillPie(Brushes.Blue, rect, sweep, 360 - sweep)

' 在画面上显示女性及男性图例。
              objGraphics.FillRectangle(Brushes.Magenta, FemaleLegend)
              objGraphics.FillRectangle(Brushes.Blue, MaleLegend)

' 在画面上显示文字内容,并指定显示内容参数、字型参数、
              ' 笔刷参数、以及位置参数。
              objGraphics.DrawString("男女平均薪资的总和:", _
                New Font("Tahoma", 10, FontStyle.Regular), _
                Brushes.Black, New PointF(0, 220))
              objGraphics.DrawString("男性平均薪资:", _
                New Font("Tahoma", 10, FontStyle.Regular), _
                Brushes.Black, New PointF(25, 265))
              objGraphics.DrawString("女性平均薪资:", _
                New Font("Tahoma", 10, FontStyle.Regular), _
                Brushes.Black, New PointF(25, 290))

objGraphics.DrawString(TotalSalary.ToString("N") + " 元", _
                New Font("Tahoma", 10, FontStyle.Regular), _
                Brushes.Black, New PointF(180, 220))
              objGraphics.DrawString(MaleSalary.ToString("N") + " 元", _
                New Font("Tahoma", 10, FontStyle.Regular), _
                Brushes.Black, New PointF(180, 265))
              objGraphics.DrawString(FemaleSalary.ToString("N") + " 元", _
                New Font("Tahoma", 10, FontStyle.Regular), Brushes.Black, _
                New PointF(180, 290))

objGraphics.SmoothingMode = Drawing2D.SmoothingMode.AntiAlias

Dim newRow As DataRow
              newRow = myPieChartTable.NewRow()
              myPieChartTable.NewRow()
              newRow("部门") = strDepartment

              Using ms As MemoryStream = New MemoryStream()
                  objBitmap.Save(ms, ImageFormat.Gif)
                  ms.Flush()
                  newRow("图形") = ms.GetBuffer()
              End Using

              myPieChartTable.Rows.Add(newRow)

            End Using
          End Using
        End While
      End Using
    End Using

    Me.DataGridView1.DataSource = myPieChartTable
  End Sub
End Class


图表1

在DataGridView控件中一次显示出多个圆饼图的原始程序代码相关推荐

  1. 在DataGridView控件中加入ComboBox下拉列表框的实现

    原文 http://www.cnblogs.com/luqingfei/archive/2007/03/28/691372.html 虽然在Visual Studio中 DataGridView控件的 ...

  2. C# 选中 DataGridView 控件中的行时显示不同的颜色

    可以利用 DataGridView 控件的 SelectionMode.ReadOnly 和 SelectionBackColor 属性实现当选中DataGridView控件中的行时显示不同的颜色. ...

  3. DataGridView 控件中至少有一列没有单元格模板的解决

    当程序动态为DataGridView添加一列时如果这样写: DataGridViewColumn col = new DataGridViewColumn (); col.Name = "c ...

  4. 获取 Windows 窗体 DataGridView 控件中选定的单元格、行和列

    获取 DataGridView 控件中选中的单元格 使用 SelectedCells 属性. 注意 使用 AreAllCellsSelected 方法可避免显示可能具有大量数据的单元格. Visual ...

  5. Visual C# 2005 - 如何于DataGridView控件中以跨数据行方式显示数据

    <?XML:NAMESPACE PREFIX = O /> 图表1 一般来说,每一个字段的内容会单独显示于DataGridView控件的一个数据行中.问题是,某些字段拥有大量文字数据,我是 ...

  6. DataGridView 控件中DataBind( )方法不能使用的情况的解决方案

    DataGridView 控件中DataBind( )方法不能使用的情况的解决方案 参考文章: (1)DataGridView 控件中DataBind( )方法不能使用的情况的解决方案 (2)http ...

  7. 如何:从 Windows 窗体 DataGridView 控件中移除自动生成的列

    如果将 DataGridView 控件设置为根据其数据源中的数据自动生成列,则可以选择忽略某些列.可以通过调用 Columns 集合的 Remove 方法进行此操作.或者,也可通过将 Visible ...

  8. DataGridView控件中显示图片及其注意事项 【z】

    windows Forms编程里面有一个DataGridView控件,它不光是可以显示数据,可以显示按钮,复选框,甚至还可以显示图片.这些图片可以来自于数据库(用二进制的方式存储的),也可以来自文件系 ...

  9. DataGridView 控件中自动生成列

    在上下机主界面的时候,因为上机时用不到下机时间,下机日期,消费金额和余额,而在下机的时候就要将这些信息显示出来.我用的是Datagridview控件,所以,为了不显示多余的信息,就让它在运行过程中可以 ...

最新文章

  1. 为人处事100条——修身养性,经典收藏!
  2. 分享Intel的安全运营中心最佳实践
  3. python基础---函数
  4. Kettle使用_1转换之错误处理
  5. 图方法:寻找无向图联通子集的JAVA版本
  6. 失望时想起了你是什么歌_你是空你是空是什么歌 你是风你是风什么歌
  7. TestNG参数化测试
  8. 静态类 c# 1614532739
  9. C#基础知识---匿名方法使用
  10. 4.6 GoogLeNet CNN、tensorflow实现——python实战
  11. 【本人秃顶程序员】SpringMVC工作原理详解
  12. 火山视窗调用易语言DLL实现返回文本
  13. 伍德里奇计量经济学导论pdf_伍德里奇 计量经济学导论 第三章第三节-1 MLR1-MLR4...
  14. 互联网协议 — Ethernet 以太网协议
  15. Mac如何用Boot Camp安装Windows 11?告诉你如何安装 能不能安装!
  16. labelme安装及标签制作
  17. 四元数在旋转的运用-圆形烟火弹道轨迹
  18. 用the_excerpt处理中文文章字数限制的方法
  19. extern C 引起的 error C2059
  20. 接口返回html页面乱码,解决nodejs中使用http请求返回值为html时乱码的问题

热门文章

  1. [官版翻译]OpenStack centos版安装(二)
  2. Windows下开发Perl程序之环境搭建
  3. Oracle 各种语法(一)
  4. JUnit 4和JUnit 5区别
  5. Docker(四) Dockerfile 详解
  6. 高性能可扩展mysql-数据库设计规范
  7. encodeURIComponent与encodeURI的区别
  8. php利用引用实现树形数组
  9. 支付宝的个人捐赠功能
  10. 分布式事务Seata的AT模式下两阶段提交原理