private void btn_Kmean_Click(object sender, EventArgs e) { this.Ana = new BLAnalysis((int)numericUpDown_ClusterAmount.Value); if (Ana.Kmean(radioButton_KmeanPlusPlus.Checked, cbb_Deparment.Text, cbb_Subject.Text, ProfessorID) == 0) { MessageBox.Show("Your data contains null value in some grade ! Please Check !"); return; } chart_AmountStudent.Show(); chart_PercentClusters.Show(); chart_AverageGrade.Show(); chart_AmountStudent.Series["Student"].Points.Clear(); chart_AverageGrade.Series["Average Grade"].Points.Clear(); chart_PercentClusters.Series["Student"].Points.Clear(); chart_PercentClusters.Series["Student"].IsValueShownAsLabel = true; using (var ctx = new UniversityContext()) { int studentAmount; if (cbb_Deparment.Text == "All") { studentAmount = ctx.Students.Count(); } else { if (cbb_Deparment.Text != string.Empty) { var departmentid = ctx.Departments.FirstOrDefault(d => d.DeparmentName == cbb_Deparment.Text).DepartmentID; studentAmount = ctx.Students.Where(s => s.DepartmentID == departmentid).Count(); } else { var subject = ctx.Subjects.SingleOrDefault(s => s.SubjectName == cbb_Subject.Text); var classes = ctx.Classes.Where(s => s.SubjectID == subject.SubjectID && s.ProfessorID == ProfessorID); var points = from grade in ctx.Grades join eachclass in classes on grade.ClassID equals eachclass.ClassID select grade; var pointList = points.GroupBy(s => s.StudentID).ToList(); studentAmount = pointList.Count; } } int count = 0; foreach (var cluster in Ana.Clusters) { chart_AmountStudent.Series["Student"].Points.AddXY("Cluster" + count.ToString(), cluster.Count()); chart_AmountStudent.Series["Student"].Points[count].Label = cluster.Count().ToString(); chart_PercentClusters.Series["Student"].Points.AddXY("Cluster" + count.ToString(), (cluster.Count() * 100 / studentAmount)); double?averageGrade = 0; foreach (var grade in Ana.CentralPoint[count]) { averageGrade += grade.Mark; } averageGrade = averageGrade / Ana.CentralPoint[count].Count(); chart_AverageGrade.Series["Average Grade"].Points.AddXY("Cluster" + count.ToString(), averageGrade); chart_AverageGrade.Series["Average Grade"].Points[count].Label = String.Format("{0:0.00}", averageGrade); count++; } } }