-
Le diagramme circulaire C# est en fait une chose très simple. Je l'ai publié parce que je souhaite implémenter une fonction qui ne peut être réalisée par aucun contrôle sur le réseau.
Après avoir cherché sur Internet pendant près d'une journée, j'avais le vertige, mais le résultat était vraiment décevant. Dans un accès de colère, j'en ai dessiné un moi-même, ce qui n'a pris que trois heures, j'espère.
Apportez de l'aide à vos amis dans le besoin et évitez les détours. La connaissance réside dans le partage et tout le monde peut progresser ensemble. Bon, plus de bêtises. Le code est le suivant. Il n'y a rien à installer.
Vous pouvez l'utiliser directement pour l'environnement C#.Net 2005 et le système d'exploitation XP, si vous devez vous connecter à la base de données pour un affichage dynamique, il vous suffit de modifier le DataTable transmis.
Il n'y a pas de remarques ci-dessus. Je pensais que c'était très simple, donc je l'ai ignoré. Je pense que tant que vous le lisez attentivement, cela devrait être très simple.
Créez d’abord un fichier aspx et publiez le code suivant. Notez que la partie rouge peut être remplacée par votre propre nom de fichier.
utiliser le système ;
en utilisant System.Collections ;
en utilisant System.ComponentModel ;
en utilisant System.Data ;
en utilisant System.Drawing ;
en utilisant System.Web ;
en utilisant System.Web.UI ;
en utilisant System.Web.UI.WebControls ;
en utilisant System.Web.UI.HtmlControls ;
en utilisant System.Drawing.Drawing2D ;
en utilisant System.Drawing.Imaging ;
en utilisant System.IO ;
classe partielle publique Test_Chart : System.Web.UI.Page
{
protected void Page_Load (expéditeur de l'objet, EventArgs e)
{
//Mettez le code utilisateur ici pour initialiser la page
Flux MemoryStream = new MemoryStream();
MemoryStream columnarStream = new MemoryStream();
Graphique bitmap = nul ;
DataTable dt = new DataTable();
dt.Columns.Add("Ven", typeof(System.String));
dt.Columns.Add("BadQty", typeof(System.Int32));
dt.Rows.Add("Weihai, Shandong", 65);
dt.Rows.Add("Huangshan, Anhui",23);
dt.Rows.Add("Jiangsu Taihu",34);
dt.Rows.Add("Shaanxi Huashan",98);
dt.Rows.Add("Montagne Jinggang, Hunan",102);
dt.Rows.Add("Hainan Nanhai",74);
graph = GetPieGraph("Statistiques du taux d'échec complexe de chaque groupe",600,500,100,30,dt);
graph.Save (flux, ImageFormat.Jpeg);
//Sortie d'image
Réponse.Clear();
Réponse.ContentType = "image/jpeg" ;
Réponse.BinaryWrite(stream.ToArray());
}
Bitmap protégé GetPieGraph (titre de la chaîne, largeur int, hauteur int, gauche int, haut int, DataTable gdt)
{
Bitmap objbitmap = nouveau Bitmap (largeur, hauteur) ;
Graphiques objgraphiques ;
objgraphics = Graphics.FromImage(objbitmap);
objgraphics.Clear(Couleur.Blanc);
StringFormat drawformat = new System.Drawing.StringFormat(StringFormatFlags.DirectionVertical);
StringFormat drawformat1 = new System.Drawing.StringFormat(StringFormatFlags.DisplayFormatControl);
objgraphics.DrawString(titre, nouvelle police("宋体", 16),Brushes.Black, 150, 5, drawformat1);
Jambe de symbole PointF = nouveau PointF (gauche, hauteur-haut-45);
PointF descleg = nouveau PointF(gauche + 20, hauteur - haut - 45);
//Dessine une bordure
objgraphics.DrawRectangle(Pens.Black, 0, 0, largeur-1, hauteur-1);
//Petit cadre dans l'image
int h = gdt.Rows.Count / 4;
si (gdt.Rows.Count % 4 > 0)
{
h = h + 1 ;
}
objgraphics.DrawRectangle(Pens.Black, gauche-10, hauteur-haut-50,gdt.Rows.Count*70+10,20*h);
//Montre quelle couleur représente quoi
pour (int i = 0; i < gdt.Rows.Count; i++)
{
si (i >= 4 && (i+1)%4==1)
{
symbolleg.Y += 20;
descleg.Y += 20;
symbolleg.X = gauche;
descleg.X = gauche + 20 ;
}
objgraphics.FillRectangle(new SolidBrush(getcolor(i)), symbolleg.X, symbolleg.Y, 12, 10);
objgraphics.DrawRectangle(Pens.Black, symbolleg.X, symbolleg.Y, 12, 10);
objgraphics.DrawString(gdt.Rows[i][0].ToString().Trim(), new Font("宋体", 10), Brushes.Black, descleg);
symbolleg.X += 100;
descleg.X += 100;
}
float sglcurrentangle = 0;
float sgltotalangle = 0 ;
float sgltotalvalues = 0 ;
pour (int i = 0; i < gdt.Rows.Count; i++)
{
sgltotalvalues += float.Parse(gdt.Rows[i][1].ToString().Trim());
}
pour (int i = 0; i < gdt.Rows.Count; i++)
{
sglcurrentangle = float.Parse(gdt.Rows[i][1].ToString().Trim()) / sgltotalvalues * 360 ;
objgraphics.FillPie(new SolidBrush(getcolor(i)), left+50, top+30, 300, 300, sgltotalangle, sglcurrentangle);
objgraphics.DrawPie (Pens.Black, gauche + 50, haut + 30 300, 300, sgltotalangle, sglcurrentangle) ;
//rayon r
doubler = 300 / 2 ;
//Position centrale du cercle :
double cX = gauche + 50 + r ;
double cY = haut + 30 + r ;
//Les coordonnées du point sur le cercle :
double dX = r * Math.Cos((360 - sgltotalangle - sglcurrentangle / 2) * 3,14 / 180);
double dY = r * Math.Sin((360 - sgltotalangle - sglcurrentangle / 2) * 3,14 / 180);
//Position sur le cercle :
double dcX = cX + dX ;
double dcY = cY - dY ;
//rayon r
doubler1 = 350 / 2 ;
//Position centrale du cercle :
double cX1 = gauche + 50 + r ;
double cY1 = haut + 30 + r ;
//Les coordonnées du point sur le cercle :
double dX1 = r1 * Math.Cos((360 - sgltotalangle - sglcurrentangle / 2) * 3,14 / 180);
double dY1 = r1 * Math.Sin((360 - sgltotalangle - sglcurrentangle / 2) * 3,14 / 180);
//Position sur le cercle :
double dcX1 = cX1 + dX1 ;
double dcY1 = cY1 - dY1 ;
objgraphics.DrawLine(Pens.Black,Convert.ToInt32(dcX) ,Convert.ToInt32(dcY),Convert.ToInt32(dcX1), Convert.ToInt32(dcY1));
si (dX1 >= 0 && dY1 >= 0)
{
objgraphics.DrawString(gdt.Rows[i][0].ToString().Trim(), new Font("宋体", 10), Brushes.Black, Convert.ToInt32(dcX1), Convert.ToInt32(dcY1 - 5 ));
}
si (dX1 <= 0 && dY1 >= 0)
{
objgraphics.DrawString(gdt.Rows[i][0].ToString().Trim(), new Font("宋体", 10), Brushes.Black, Convert.ToInt32(dcX1 - 25), Convert.ToInt32(dcY1 - 15));
}
si (dX1 <= 0 && dY1 <= 0)
{
objgraphics.DrawString(gdt.Rows[i][0].ToString().Trim(), new Font("宋体", 10), Brushes.Black, Convert.ToInt32(dcX1 - 30), Convert.ToInt32(dcY1 ));
}
si (dX1 >= 0 && dY1 <= 0)
{
objgraphics.DrawString(gdt.Rows[i][0].ToString().Trim(), new Font("宋体", 10), Brushes.Black, Convert.ToInt32(dcX1), Convert.ToInt32(dcY1)) ;
}
//GetLet(gauche + 50+150, haut + 30+150 300,sgltotalangle, sglcurrentangle,arrvalues[i].ToString());
sglangletotal += sglangleactuel ;
}
retourner objbitmap ;
}
protected void GetLet (int startX, int startY, double dia, double totalAngle, double currentAngle, string leg)
{
doublex = 0 ;
double y = 0 ;
double r = diamètre / 2 ;
x = r * Math.Cos((360 - angle total - angle actuel / 2) * 3,14 / 180);
y = r * Math.Sin((360 - angle total - angle actuel / 2) * 3,14 / 180);
}
Couleur protégée getcolor (int itemindex)
{
Couleur de l'objet ;
si (itemindex >= 14)
{
indice d'élément = indice d'élément % 14 ;
}
si (itemindex == 0)
{
objcolor = Couleur.DarkMagenta ;
}
sinon si (itemindex == 1)
{
objcolor = Couleur.MediumAquamarine;
}
sinon si (itemindex == 2)
{
objcolor = Color.DeepSkyBlue;
}
sinon si (itemindex == 3)
{
objcolor = Couleur.DarkRed;
}
sinon si (itemindex == 4)
{
objcolor = Couleur.Pink;
}
sinon si (itemindex == 5)
{
objcolor = Couleur.Saumon;
}
sinon si (itemindex == 6)
{
objcolor = Couleur.Khaki;
}
sinon si (itemindex == 7)
{
objcolor = Couleur.Maroon;
}
sinon si (itemindex == 8)
{
objcolor = Couleur.LawnGreen;
}
sinon si (itemindex == 9)
{
objcolor = Color.LightGoldenrodYellow;
}
sinon si (itemindex == 10)
{
objcolor = Couleur.Mocassin ;
}
sinon si (itemindex == 11)
{
objcolor = Couleur.YellowGreen;
}
sinon si (itemindex == 12)
{
objcolor = Couleur.DarkCyan;
}
sinon si (itemindex == 13)
{
objcolor = Couleur.SteelBlue;
}
sinon si (itemindex == 14)
{
objcolor = Couleur.Tomate;
}
autre
{
objcolor = Couleur.SlateGray;
}
renvoie la couleur de l'objet ;
}
}