http://topic.csdn.net/u/20090821/12/848ca7ce-b6f6-4f18-9dd7-36d39ef877b7.html?seed=1519476530&r=59248950#r_59248950
这里还有个问题,也是我问的,谁要是知道的顺便也帮帮看看吧,也是100分的帖子。

解决方案 »

  1.   

    使用GDI+绘制 好象这个和甘特图差不多啊.
      

  2.   

    上传图片到相册等,添加链接地址
    这种图形可使用第三方控件或用datagridview实现
    http://topic.csdn.net/u/20090815/00/02b4b816-65bc-4dcf-b054-bafc3aac44cf.html
      

  3.   

    很简单,如果只是显示这种效果而不要求图形细节的话直接用DataGridView就行了
    列标头就是你的 1 2 3 4 5 6 7 8 9 10....
    每一行就是每一个型号,行标头上写上型号,然后再设置每一行对应的单元格的背景色就OK了~
      

  4.   


    这个方法我也想过了,不过看起来实在是......
    后来有人用panel控件,画画的方式给我画了个大概的出来,不过是死的,数据变动比较困难
      

  5.   

    那就用GDI+了,也不复杂,不过想交互的话就比较麻烦.
      

  6.   

    对了,还有一个方便简单的方法,你可以用HTML来做啊,然后用控件来显示就行了,可以做的很漂亮的,还可以交互.
      

  7.   

    我也是主要做Winform的,我有很多Winform的软件在里面有一些数据表现时也会用html啊,用起来感觉不到是html的,又不需要生成html文件,直接生成html文本流给webbrowser控件就OK了,html的格式表现这么强,干嘛不用?
      

  8.   

    g.FillRectangle(Brushes.BlueViolet,new Rectangle(x, y, between ));
    //画矩形
      

  9.   

    g.FillRectangle(Brushes.BlueViolet,new Rectangle(x, y, X1,X2)); 
    //画矩形
      

  10.   

    用ASP。net做方便
    用winform做烦
      

  11.   

    不会C#,用VB2008写的,转成C#即可。Public Class Form1
        Private BP As Bitmap
        Private XX, YY As Integer
        Private GradPen As New Pen(Color.ForestGreen, 1)
        Private SF As New StringFormat
        Private Hline, Vline, Twidth, HeaderHeight As Integer
        Private Title As String
        Private C1 As New Collection
        Private Structure DYitem
            Dim Text As String
            Dim StartDay, EndDay As Integer
        End Structure
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            If BP IsNot Nothing Then BP.Dispose()
            BP = New Bitmap(Panel1.Width, Panel1.Height)
            Hline = 18  '需要的天数,限于发帖宽度,此处演示18天
            Vline = 15  '需要的行数+1
            Title = "生产时间" '左上角标头文字
            HeaderHeight = 20 '标头栏高度
            XX = BP.Width
            YY = BP.Height
            SF.Alignment = StringAlignment.Center
            SF.LineAlignment = StringAlignment.Center
            Using G As Graphics = Graphics.FromImage(BP)
                Using LG As New Drawing2D.LinearGradientBrush(New Point(0, 0), New Point(0, YY), Color.White, Color.LightGoldenrodYellow)
                    G.FillRectangle(LG, New Rectangle(0, 0, XX - 1, YY - 1))
                End Using
                Using LG As New Drawing2D.LinearGradientBrush(New Point(0, 0), New Point(0, HeaderHeight), Color.SkyBlue, Color.SteelBlue)
                    G.FillRectangle(LG, New Rectangle(0, 0, XX - 1, HeaderHeight))
                End Using
                Dim J As Integer = 0
                Twidth = 0
                For I As Integer = 0 To Title.Length - 1
                    Twidth += New Font("宋体", 9, FontStyle.Regular, GraphicsUnit.Point).Size
                Next
                G.DrawString(Title, New Font("宋体", 9, FontStyle.Regular, GraphicsUnit.Point), Brushes.Black, New Rectangle(1, 1, Twidth * 2, HeaderHeight), SF)
                G.DrawString(Title, New Font("宋体", 9, FontStyle.Regular, GraphicsUnit.Point), Brushes.White, New Rectangle(0, 0, Twidth * 2, HeaderHeight), SF)
                For I As Integer = Twidth * 2 To XX Step Int((XX - Twidth * 2) / Hline)
                    GradPen.DashStyle = Drawing2D.DashStyle.Dot
                    G.DrawLine(Me.GradPen, I, 0, I, YY)
                    J += 1
                    G.DrawString(J, New Font("宋体", 9, FontStyle.Regular, GraphicsUnit.Point), Brushes.Black, New Rectangle(I + 1, 1, XX / Hline, HeaderHeight), SF)
                    G.DrawString(J, New Font("宋体", 9, FontStyle.Regular, GraphicsUnit.Point), Brushes.White, New Rectangle(I, 0, XX / Hline, HeaderHeight), SF)
                Next
                Dim tmp1 As Integer = 0
                Dim DYM As DYitem
                Using LG2 As New Drawing2D.LinearGradientBrush(New Point(0, 0), New Point(0, 1), Color.FromArgb(180, 62, 83, 188), Color.FromArgb(180, 62, 83, 188))
                    For I As Integer = HeaderHeight To YY Step Int(YY / Vline)
                        GradPen.DashStyle = Drawing2D.DashStyle.Dot
                        G.DrawLine(Me.GradPen, 0, I, XX, I)
                        tmp1 += 1
                        If tmp1 < C1.Count Then
                            DYM = C1(tmp1)
                            G.DrawString(DYM.Text, New Font("宋体", 9, FontStyle.Regular, GraphicsUnit.Point), Brushes.Black, New Rectangle(0, I + 2, Twidth * 2, (YY - HeaderHeight) / Vline), SF)
                            G.FillRectangle(LG2, New Rectangle(Twidth * 2 + Int((XX - Twidth * 2) / Hline * DYM.StartDay), (YY - HeaderHeight) / Vline / 3 + I - 2, Int(Twidth * 2 + (XX - Twidth * 2) / Hline * (DYM.EndDay - DYM.StartDay)), (YY - HeaderHeight) / Vline / 3 * 2))
                        End If
                    Next
                End Using
                G.DrawRectangle(Pens.Black, New Rectangle(0, 0, XX - 1, YY - 1))
                G.DrawLine(Pens.Black, 0, HeaderHeight, XX - 1, HeaderHeight)
            End Using
            Panel1.BackgroundImage = BP
        End Sub    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            C1.Clear()
            Dim DYM As DYitem
            Dim SourceString() As String = {"魔法长袍", "战魂真悟", "奥特之光", "定缘神剑", "如奶神掌", "天启坦克", "屁屁神功", "测试内容", "葵花宝典", "泡妞秘笈", "无相神功", "战神手套", "魔法手套"}
            For I As Integer = 0 To SourceString.Length - 1
                DYM = New DYitem
                With DYM
                    .Text = SourceString(I)
                    .StartDay = Int(Rnd() * 5)
                    .EndDay = Int(Rnd() * 3 + .StartDay)
                End With
                C1.Add(DYM)
            Next
        End Sub
      

  12.   

    窗体上:
    Panel1
    Button1
    贴入代码后直接F5运行即可
      

  13.   

    public class Form1 

        private Bitmap BP; 
        private int XX; 
        private int YY; 
        private Pen GradPen = new Pen(Color.ForestGreen, 1); 
        private StringFormat SF = new StringFormat(); 
        private int Hline; 
        private int Vline; 
        private int Twidth; 
        private int HeaderHeight; 
        private string Title; 
        private Collection C1 = new Collection(); 
        private struct DYitem 
        { 
            public string Text; 
            public int StartDay; 
            public int EndDay; 
        } 
        
     // 这个写在Button点击事件里    { 
            if (BP != null) BP.Dispose(); 
            BP = new Bitmap(Panel1.Width, Panel1.Height); 
            Hline = 18; 
            //需要的天数,限于发帖宽度,此处演示18天 
            Vline = 15; 
            //需要的行数+1 
            Title = "生产时间"; 
            //左上角标头文字 
            HeaderHeight = 20; 
            //标头栏高度 
            XX = BP.Width; 
            YY = BP.Height; 
            SF.Alignment = StringAlignment.Center; 
            SF.LineAlignment = StringAlignment.Center; 
            using (Graphics G = Graphics.FromImage(BP)) { 
                using (Drawing2D.LinearGradientBrush LG = new Drawing2D.LinearGradientBrush(new Point(0, 0), new Point(0, YY), Color.White, Color.LightGoldenrodYellow)) { 
                    G.FillRectangle(LG, new Rectangle(0, 0, XX - 1, YY - 1)); 
                } 
                using (Drawing2D.LinearGradientBrush LG = new Drawing2D.LinearGradientBrush(new Point(0, 0), new Point(0, HeaderHeight), Color.SkyBlue, Color.SteelBlue)) { 
                    G.FillRectangle(LG, new Rectangle(0, 0, XX - 1, HeaderHeight)); 
                } 
                int J = 0; 
                Twidth = 0; 
                for (int I = 0; I <= Title.Length - 1; I++) { 
                    Twidth += new Font("宋体", 9, FontStyle.Regular, GraphicsUnit.Point).Size; 
                } 
                G.DrawString(Title, new Font("宋体", 9, FontStyle.Regular, GraphicsUnit.Point), Brushes.Black, new Rectangle(1, 1, Twidth * 2, HeaderHeight), SF); 
                G.DrawString(Title, new Font("宋体", 9, FontStyle.Regular, GraphicsUnit.Point), Brushes.White, new Rectangle(0, 0, Twidth * 2, HeaderHeight), SF); 
                for (int I = Twidth * 2; I <= XX; I += Conversion.Int((XX - Twidth * 2) / Hline)) { 
                    GradPen.DashStyle = Drawing2D.DashStyle.Dot; 
                    G.DrawLine(this.GradPen, I, 0, I, YY); 
                    J += 1; 
                    G.DrawString(J, new Font("宋体", 9, FontStyle.Regular, GraphicsUnit.Point), Brushes.Black, new Rectangle(I + 1, 1, XX / Hline, HeaderHeight), SF); 
                    G.DrawString(J, new Font("宋体", 9, FontStyle.Regular, GraphicsUnit.Point), Brushes.White, new Rectangle(I, 0, XX / Hline, HeaderHeight), SF); 
                } 
                int tmp1 = 0; 
                DYitem DYM = default(DYitem); 
                using (Drawing2D.LinearGradientBrush LG2 = new Drawing2D.LinearGradientBrush(new Point(0, 0), new Point(0, 1), Color.FromArgb(180, 62, 83, 188), Color.FromArgb(180, 62, 83, 188))) { 
                    for (int I = HeaderHeight; I <= YY; I += Conversion.Int(YY / Vline)) { 
                        GradPen.DashStyle = Drawing2D.DashStyle.Dot; 
                        G.DrawLine(this.GradPen, 0, I, XX, I); 
                        tmp1 += 1; 
                        if (tmp1 < C1.Count) { 
                            DYM = C1(tmp1); 
                            G.DrawString(DYM.Text, new Font("宋体", 9, FontStyle.Regular, GraphicsUnit.Point), Brushes.Black, new Rectangle(0, I + 2, Twidth * 2, (YY - HeaderHeight) / Vline), SF); 
                            G.FillRectangle(LG2, new Rectangle(Twidth * 2 + Conversion.Int((XX - Twidth * 2) / Hline * DYM.StartDay), (YY - HeaderHeight) / Vline / 3 + I - 2, Conversion.Int(Twidth * 2 + (XX - Twidth * 2) / Hline * (DYM.EndDay - DYM.StartDay)), (YY - HeaderHeight) / Vline / 3 * 2)); 
                        } 
                    } 
                } 
                G.DrawRectangle(Pens.Black, new Rectangle(0, 0, XX - 1, YY - 1)); 
                G.DrawLine(Pens.Black, 0, HeaderHeight, XX - 1, HeaderHeight); 
            } 
            Panel1.BackgroundImage = BP; 
        } 
        
       
    //这个写在Form_Load里
        { 
            C1.Clear(); 
            DYitem DYM = default(DYitem); 
            string[] SourceString = { "魔法长袍", "战魂真悟", "奥特之光", "定缘神剑", "如奶神掌", "天启坦克", "屁屁神功", "测试内容", "葵花宝典", "泡妞秘笈", 
            "无相神功", "战神手套", "魔法手套" }; 
            for (int I = 0; I <= SourceString.Length - 1; I++) { 
                DYM = new DYitem(); 
                { 
                    DYM.Text = SourceString(I); 
                    DYM.StartDay = Conversion.Int(VBMath.Rnd() * 5); 
                    DYM.EndDay = Conversion.Int(VBMath.Rnd() * 3 + DYM.StartDay); 
                } 
                C1.Add(DYM); 
            } 
        } 
    }以上是网上在线转换来的。
      

  14.   


    首先,你画图要有画板吧?你在什么地方画东西?所以需要
    Graphics,有了画板你得有笔来画线条啊 所以有了Pen恩,写什么字好看呢?狂草还是楷书?多大的字才好?我们需要一个Font你要在什么地方开始画?画多大面积?所以有了Point,Size.画出了轮廓你得上色啊?怎么上色?所以有了Brush如果你要修改一张图片怎么办?
    你需要有图片先吧?
    所以有了Image,但是电脑里图片有矢量,位图。
    Image就成了抽象类,位图Bitmap是Image的实现类.然后把图片夹到画板上才能修改啊
    Image image = Image.FromFile("C:\\1.jpg");
    Graphics g = Graphics.FromImage(image);架上图片了你就可以在画板上涂改了啊我要写多几个字上去
    string str = "我恨Baidu";  //写什么字?
    Font font = Font("宋体",30f); //字是什么样子的?
    Brush brush = Brushes.Red;  //用红色涂上我的字吧;
    PointF point = new PointF(10f,10f); //从什么地方开始写字捏?//横着写还是竖着写呢?
    System.Drawing.StringFormat sf = new System.Drawing.StringFormat();
    //还是竖着写吧
    sf.FormatFlags = StringFormatFlags.DirectionVertical//开始写咯
    g.DrawString(str,font,brush,point,sf);//写好了,我要把我的作品收藏起来image.Save("C:\\1.jpg"); 不过你要是能像他一样讲解下就更好了,因为我第一次用Winfrom画图,属于菜鸟级别。呵呵
      

  15.   

    用datagridview来做好了,需要填的时候遍历填即可。
      

  16.   

    对了不用panel不行吗?
    我朋友的朋友给我们写的也是用这控件,和你写的大同小异
      

  17.   


    无论用什么都可以,哪怕你用的是个button都可以画上去。
    或者干脆什么都不用,直接在桌面上画都可以。
      

  18.   

    拥有BackGroundImage或是Image属性的控件都可以.我的代码目的是生成一张最终结果图.也就是表格.而这个表格是一个Bitmap图片,你甚至可以直接把它保存到硬盘里.
      

  19.   

    如果你做的粗糙的话,画个矩形,刷个色就行了,如果做的好一点,估计就要用控件,然后重写OnPaint或 OnDrawItem ...方法
      

  20.   

    你会用到这两个:using System.Drawing; //包含画布,画笔,颜色,画刷... using Windows.Forms;public class A : UserControl
    {
       public Rectangle Bounds          //建立矩形区域
       {
         get {return  new Rectangle(起点x,
                                        起点y,
                                           宽,
                                          高
             )}                                 //这里自己设置;
       }
       protected override void OnPaint(PaintEventArgs e)
       { 
         Pen pen = new Pen(Color.Black);  // Color是枚举,选个颜色画矩形框;
         e.Graphics.DrawRectangle(pen,Bounds)// 画框;
          Brush brush = new brush(Color.XXX) //选个笔刷颜色;
          e.Graphics.FillRectangle(brush,Bounds); //填充矩形;
       }
      

  21.   

    其余的文字之类用DrawString(String xx,Font xx,Brush xx,X,Y) // Font xx = new Font("宋体",12), X,Y 起点坐标;
      

  22.   


    原来拥有BackGroundImage或是Image属性的控件都可以啊,我说怎么都用这个空间呢。对了,我运行了下,开头:private Collection C1 = new Collection();
    这个地方同不过,说:找不到类别或命名空间名称‘Collection’(你是否遗漏using指示词或组件参考?)
      

  23.   

    菜鸟没办法,这边的分给你了,你去那边顺便回个http://topic.csdn.net/u/20090825/08/792bbd70-c4fb-41ca-8cb1-8a2206482f6c.html?16953
      

  24.   

    似乎就是一个简单点的甘特图来着甘特图实际有很多第3方图表控件都支持,可以直接拿来用如果自己做,可能最简单的方式就是重绘一下datagridview就成,可以简单继承一个colums重绘一下背景就可以了
      

  25.   

    dylike快来,我要结贴了,把你这贴那个小问题告诉我,等我想问深入点的东西时再开贴问你吧
      

  26.   

    可以把Collection做成ArrayList,我是在VB中写的,可能C#略有不同,那么就用ArrayList来存放,它只是用来存放一些东西罢了.
      

  27.   

    ArrayList 还是错的......
    ArrayList是什么意思?范型?