-
Круговая диаграмма C# на самом деле очень простая вещь. Я опубликовал ее, потому что хочу реализовать функцию, которую невозможно реализовать с помощью любого элемента управления в сети.
После почти суток поиска в Интернете у меня закружилась голова, но результат меня очень разочаровал. В порыве гнева я нарисовал один, на что ушло всего три часа, надеюсь, получится.
Окажите помощь нуждающимся друзьям и избегайте обходных путей. Знания заключаются в обмене знаниями, и каждый может добиться прогресса вместе. Ладно, больше никакой ерунды. Код следующий. Не нужно ничего устанавливать.
Вы можете использовать его напрямую. Для среды C#.Net 2005 и операционной системы XP, если вам нужно подключиться к базе данных для динамического отображения, вам нужно только изменить переданный DataTable.
Выше нет никаких замечаний. Я думал, что это очень просто, поэтому я проигнорировал это. Я считаю, что если вы внимательно прочитаете, это должно быть очень просто.
Сначала создайте файл aspx и опубликуйте следующий код. Обратите внимание, что красную часть можно изменить на собственное имя файла.
использование системы;
использование System.Collections;
использование System.ComponentModel;
использование System.Data;
использование System.Drawing;
использование System.Web;
использование System.Web.UI;
использование System.Web.UI.WebControls;
использование System.Web.UI.HtmlControls;
используя System.Drawing.Drawing2D;
использование System.Drawing.Imaging;
использование System.IO;
общедоступный частичный класс Test_Chart: System.Web.UI.Page
{
protected void Page_Load (отправитель объекта, EventArgs e)
{
//Поместите сюда пользовательский код для инициализации страницы
Поток MemoryStream = новый MemoryStream();
MemoryStream columnsarStream = новый MemoryStream();
Растровый график = ноль;
DataTable dt = новый DataTable();
dt.Columns.Add("Вен", typeof(System.String));
dt.Columns.Add("BadQty", typeof(System.Int32));
dt.Rows.Add("Вэйхай, Шаньдун", 65);
dt.Rows.Add("Хуаншань, Аньхой",23);
dt.Rows.Add("Цзянсу Тайху",34);
dt.Rows.Add("Шэньси Хуашань",98);
dt.Rows.Add("Гора Цзинган, Хунань", 102);
dt.Rows.Add("Хайнань Наньхай",74);
Graph = GetPieGraph("Комплексная статистика отказов каждой группы",600,500,100,30,dt);
график.Сохранить(поток, ImageFormat.Jpeg);
//Вывод изображения
Ответ.Очистить();
Response.ContentType = "изображение/jpeg";
Response.BinaryWrite(stream.ToArray());
}
защищенное растровое изображение GetPieGraph (заголовок строки, ширина целого числа, высота целого числа, целое число слева, целое число сверху, DataTable gdt)
{
Растровое изображение objbitmap = новое растровое изображение (ширина, высота);
Графическая графика;
objgraphics = Graphics.FromImage(objbitmap);
objgraphics.Clear(Цвет.Белый);
StringFormat drawformat = новый System.Drawing.StringFormat(StringFormatFlags.DirectionVertical);
StringFormat drawformat1 = новый System.Drawing.StringFormat(StringFormatFlags.DisplayFormatControl);
objgraphics.DrawString(title, new Font("宋体", 16),Brushes.Black, 150, 5, drawformat1);
PointFsymbolleg = новый PointF(слева, высота-верх-45);
PointF descleg = новый PointF(слева + 20, высота - сверху - 45);
//Рисуем границу
objgraphics.DrawRectangle(Pens.Black, 0, 0, ширина-1, высота-1);
//Маленькая рамка внутри картинки
int h = gdt.Rows.Count/4;
если (gdt.Rows.Count % 4 > 0)
{
ч = ч + 1;
}
objgraphics.DrawRectangle(Pens.Black, left-10, height-top-50,gdt.Rows.Count*70+10,20*h);
//Показать, какой цвет что обозначает
for (int i = 0; i < gdt.Rows.Count; i++)
{
если (я >= 4 && (i+1)%4==1)
{
символлег.Y += 20;
descleg.Y += 20;
символleg.X = слева;
descleg.X = влево + 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);
символлег.Х += 100;
descleg.X += 100;
}
поплавок sglcurrentangle = 0;
поплавок sgltotalangle = 0;
плавающее значение sgltotalvalues = 0;
for (int i = 0; i < gdt.Rows.Count; i++)
{
sgltotalvalues += float.Parse(gdt.Rows[i][1].ToString().Trim());
}
for (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, left + 50, top + 30,300, 300, sgltotalangle, sglcurrentangle);
//радиус r
двойной г = 300/2;
//Положение центра круга:
двойной cX = левый + 50 + r;
двойной cY = верх + 30 + r;
//Координаты точки на окружности:
double dX = r * Math.Cos((360 - sgltotalangle - sglcurrentangle/2) * 3,14/180);
double dY = r * Math.Sin((360 - sgltotalangle - sglcurrentangle/2) * 3,14/180);
//Позиция на круге:
двойной dcX = cX + dX;
двойной dcY = cY - dY;
//радиус r
двойной r1 = 350/2;
//Положение центра круга:
двойной cX1 = левый + 50 + r;
двойной cY1 = верх + 30 + r;
//Координаты точки на окружности:
double dX1 = r1 * Math.Cos((360 - sgltotalangle - sglcurrentangle / 2) * 3,14/180);
double dY1 = r1 * Math.Sin((360 - sgltotalangle - sglcurrentangle / 2) * 3,14 / 180);
//Позиция на круге:
двойной dcX1 = cX1 + dX1;
двойной dcY1 = cY1 - dY1;
objgraphics.DrawLine(Pens.Black,Convert.ToInt32(dcX), Convert.ToInt32(dcY),Convert.ToInt32(dcX1), Convert.ToInt32(dcY1));
если (dX1 >= 0 && dY1 >= 0)
{
objgraphics.DrawString(gdt.Rows[i][0].ToString().Trim(), new Font("宋体", 10), Brushes.Black, Convert.ToInt32(dcX1), Convert.ToInt32(dcY1 - 5) ));
}
если (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));
}
если (dX1 <= 0 && dY1 <= 0)
{
objgraphics.DrawString(gdt.Rows[i][0].ToString().Trim(), new Font("宋体", 10), Brushes.Black, Convert.ToInt32(dcX1 - 30), Convert.ToInt32(dcY1) ));
}
если (dX1 >= 0 && dY1 <= 0)
{
objgraphics.DrawString(gdt.Rows[i][0].ToString().Trim(), new Font("宋体", 10), Brushes.Black, Convert.ToInt32(dcX1), Convert.ToInt32(dcY1)) ;
}
//GetLet(left + 50+150, top + 30+150,300,sgltotalangle, sglcurrentangle,arrvalues[i].ToString());
sgltotalangle += sglcurrentangle;
}
вернуть объектную карту;
}
protected void GetLet(int startX, int startY, двойной диаметр, двойной totalAngle, двойной currentAngle, ножка строки)
{
двойной х = 0;
двойной у = 0;
двойной г = диаметр/2;
x = r * Math.Cos((360 - totalAngle - currentAngle/2) * 3,14/180);
y = r * Math.Sin((360 - totalAngle - currentAngle/2) * 3,14/180);
}
protected Color getcolor(int itemindex)
{
Цвет объекта;
если (индекс элемента >= 14)
{
индекс предмета = индекс предмета % 14;
}
если (индекс элемента == 0)
{
objcolor = Color.DarkMagenta;
}
иначе, если (itemindex == 1)
{
objcolor = Color.MediumAquamarine;
}
иначе, если (itemindex == 2)
{
objcolor = Color.DeepSkyBlue;
}
иначе, если (itemindex == 3)
{
objcolor = Color.DarkRed;
}
иначе, если (itemindex == 4)
{
objcolor = Цвет.Розовый;
}
иначе, если (itemindex == 5)
{
objcolor = Цвет.Лосось;
}
иначе, если (itemindex == 6)
{
objcolor = Цвет.Хаки;
}
иначе, если (itemindex == 7)
{
objcolor = Цвет.Бордовый;
}
иначе, если (itemindex == 8)
{
objcolor = Color.LawnGreen;
}
иначе, если (itemindex == 9)
{
objcolor = Color.LightGoldenrodYellow;
}
иначе, если (itemindex == 10)
{
objcolor = Цвет.Мокасин;
}
иначе, если (itemindex == 11)
{
objcolor = Цвет.ЖелтыйЗеленый;
}
иначе, если (itemindex == 12)
{
objcolor = Color.DarkCyan;
}
иначе, если (itemindex == 13)
{
objcolor = Цвет.СтальнойСиний;
}
иначе, если (itemindex == 14)
{
objcolor = Цвет.Помидор;
}
еще
{
objcolor = Color.SlateGray;
}
вернуть цвет объекта;
}
}