如何使用C#.Net在DataGridView单元格中创建/绘制Pi图

如何使用C#.Net在DataGridView单元格中创建/绘制Pi图,c#,datagridview,datagridviewcellstyle,C#,Datagridview,Datagridviewcellstyle,我的目标是在DataGridView单元中实现Pi图,它将显示待处理订单销售点系统的重命名时间 当我们在POS系统下订单时,它可以是发货单或收款单。 交货单和收款单包含完成时间。 开发这样一个场景,当时间接近完成时间时,Pi图中显示的重命名时间减少 当当前时间到达重命名时间时,图表上必须显示0 步骤1:如何在Datagridview单元格中创建条形图 首先,我们有这些参数或值 下订单时间 订单完成时间(完成订单所需的时间,例如120分钟) 当前系统时间 选择DatagridView表单工具箱和

我的目标是在DataGridView单元中实现Pi图,它将显示待处理订单销售点系统的重命名时间

当我们在POS系统下订单时,它可以是发货单或收款单。 交货单和收款单包含完成时间。 开发这样一个场景,当时间接近完成时间时,Pi图中显示的重命名时间减少

当当前时间到达重命名时间时,图表上必须显示0

步骤1:如何在Datagridview单元格中创建条形图

首先,我们有这些参数或值

  • 下订单时间
  • 订单完成时间(完成订单所需的时间,例如120分钟)
  • 当前系统时间
  • 选择DatagridView表单工具箱和图表

    此Datagridview包含以下列:

    然后创建一个函数

     private void GenerateGraphOfRemaingTiming()
    {
    
        try
        {
    
            DateTime moment = DateTime.Now;
            
            chart1.Visible = false;
    
            chart1.ClientSize = new Size(37, 37);
            Bitmap bmp = new Bitmap(chart1.ClientSize.Width, chart1.ClientSize.Height);
            for (int row = 0; row < dataGridView_RecentOrder.RowCount; row++)
            {
                chart1.Series.Clear();
                chart1.Legends.Clear();
                int Hour = int.Parse(moment.Hour.ToString());
                int Min = int.Parse(moment.Minute.ToString());
                int Sec = int.Parse(moment.Second.ToString());
             
                //Add a new chart-series
                string seriesname = "MySeriesName";
                chart1.Series.Add(seriesname);
                //set the chart-type to "Pie"
                chart1.Series[seriesname].ChartType = SeriesChartType.Pie;
    
                //Add some datapoints so the series. in this case you can pass the values to this method
    
                chart1.Series[seriesname].LabelForeColor = Color.White;
                chart1.Series[seriesname].BackSecondaryColor = Color.FromArgb(192, 192, 255);
                
                string OrderDateTime = dataGridView_RecentOrder.Rows[row].Cells["Order_PlacingTime"].Value.ToString();
               
                var result = Convert.ToDateTime(OrderDateTime);
    
                int OHour = int.Parse(result.ToString("HH", System.Globalization.CultureInfo.CurrentCulture));
                int OMin = int.Parse(result.ToString("mm", System.Globalization.CultureInfo.CurrentCulture));
                int OnSec = int.Parse(result.ToString("ss", System.Globalization.CultureInfo.CurrentCulture));
    
                int OrderMinuts =Convert.ToInt32( (OHour * 60) + OMin + OnSec * 0.0166667);
                int NowTimeInMinuts = Convert.ToInt32( (Hour * 60) + Min + (Sec * 0.0166667));
                int FinalOrderMinutes = int.Parse(dataGridView_RecentOrder.Rows[row].Cells["Order_CompletionTime"].Value.ToString()) - (NowTimeInMinuts - OrderMinuts);
                if (FinalOrderMinutes <= 0)
                {
                    FinalOrderMinutes = 0;
                }
                int OrderCompletionTime = int.Parse(dataGridView_RecentOrder.Rows[row].Cells["Order_CompletionTime"].Value.ToString());
                if (OrderCompletionTime == 0)
                {
    
                    OrderCompletionTime = 1;
                }
    
                int OrderTimingDifference = OrderCompletionTime - FinalOrderMinutes;
                //  MessageBox.Show("Order Min: "+ OrderMinuts.ToString() +"\n Now Time in Min: "+NowTimeInMinuts.ToString());
                chart1.Series[seriesname].Points.AddXY("", OrderTimingDifference);
                chart1.Series[seriesname].Points.AddXY(FinalOrderMinutes.ToString(), FinalOrderMinutes);
             
                chart1.DrawToBitmap(bmp, chart1.ClientRectangle);
    
               // bmp = OvalImage(bmp);
    
                dataGridView_RecentOrder.Rows[row].Cells["Order_RemaningTime"].Value = bmp.Clone();
              
            }
        }
        catch (Exception ex)
        {
    
            MessageBox.Show(ex.ToString());
        }
    
    }
    

    或者,您可以在CellPaint事件中简单地使用Filllelipe、FillPie和DrawString调用。3行代码,外加一行计算扫描角度的代码。@TaW我没有使用CellPaint事件,你能提供相关内容吗,谢谢
    private void dataGridView1_CellPaint(对象发送方,DataGridViewCellPaintingEventArgs e){if(e.ColumnIndex==0){int val=(int)dataGridView1[0,1].Value;e.PaintBackground(e.CellBounds,true);paintPie(e.Graphics,e.RowIndex,e.CellBounds,val);e.Handled=true;}
    void paintPie(Graphics g,int row,Rectangle rBounds,intval){int rad=Math.Min(rBounds.Width,rBounds.Height)-2;矩形r=新矩形(rBounds.X,rBounds.Y,rad,rad);g.FillEllipse(Bruss.LightBlue,r);g.FillPie(Bruss.Orange,r,0,val);g.DrawString(val+“”,Font,Bruss.Black,r);}
    这只是一个非常简单的饼图绘制示例。它假定扫掠角度位于相邻单元格中,并使用默认字体。您需要计算角度,可能需要反转方向等,并显示合适的字符串。请编辑您的问题并向我们展示您的尝试。并描述当前解决方案中存在的任何问题。你可能还想读书
        public void StartOrderTimingCounter()
        {
    
            System.Windows.Forms.Timer OrderRemaningTimer = new System.Windows.Forms.Timer();
            OrderRemaningTimer.Interval = 60000; // specify interval time as you want
            
            OrderRemaningTimer.Tick += new EventHandler(timer_Tick);
            OrderRemaningTimer.Start();
            
    
    
        }
      
        void timer_Tick(object sender, EventArgs e)
        {
    // call above implemented function
            GenerateGraphOfRemaingTiming();
          
        }