void addCalculatedColumn(DataTable pivotedDataTable, DataTable fieldIdAndNameTable, ICalcuation calculationStrategy) { List <int> values = new List <int>(); List <int> maxValues = new List <int>(); DataColumn calculatedMarks = new DataColumn("calculated marks"); pivotedDataTable.Columns.Add(calculatedMarks); List <string> fieldNames = new List <string>(); List <int> fieldIDs = new List <int>(); // Get subjectTable for maxMarks SqlDataAdapter adapter = new SqlDataAdapter("SELECT maxMarks FROM subjectFields WHERE subjectid = " + getCurrentSubjectId(), conn); DataTable maxMarksTable = new DataTable(); adapter.Fill(maxMarksTable); foreach (DataRow row in fieldIdAndNameTable.Rows) { fieldIDs.Add(Convert.ToInt32(row["fieldid"])); fieldNames.Add(row["fieldname"].ToString()); } foreach (DataRow row in pivotedDataTable.Rows) { values.Clear(); maxValues.Clear(); // Get marks of the student from pivotedDataTable foreach (DataColumn column in pivotedDataTable.Columns) { // if the column is a field if (fieldNames.Contains(column.ColumnName)) { values.Add(Convert.ToInt32(row[column])); } } // Get max marks foreach (DataRow marksRow in maxMarksTable.Rows) { maxValues.Add(Convert.ToInt32(marksRow["maxMarks"])); } row[calculatedMarks] = calculationStrategy.getResults(values, maxValues); } return; }