patterncsharpMinor
Saving student scores
Viewed 0 times
studentsavingscores
Problem
I have a program where it takes the students name and last name and score and saves it. When checking to see if a
```
public void CheckData()
{
if (first1.Text != empty & score1.Text != empty & last1.Text != empty &
first2.Text != empty & score2.Text != empty & last2.Text != empty &
first3.Text != empty & score3.Text != empty & last3.Text != empty &
first4.Text != empty & score4.Text != empty & last4.Text != empty &
first5.Text != empty & score5.Text != empty & last5.Text != empty)
{
student1 = new Student(first1.Text, last1.Text, Convert.ToInt32(score1.Text));
student2 = new Student(first2.Text, last2.Text, Convert.ToInt32(score2.Text));
student3 = new Student(first3.Text, last3.Text, Convert.ToInt32(score3.Text));
student4 = new Student(first4.Text, last4.Text, Convert.ToInt32(score4.Text));
student5 = new Student(first5.Text, last5.Text, Convert.ToInt32(score5.Text));
if (first6.Text != empty & score6.Text != empty & last6.Text != empty)
{
student6 = new Student(first6.Text, last6.Text, Convert.ToInt32(score6.Text));
if (first7.Text != empty & score7.Text != empty & last7.Text != empty)
{
student7 = new Student(first7.Text, last7.Text, Convert.ToInt32(score7.Text));
if (first8.Text != empty & score8.Text != empty & last8.Text != empty)
{
student8 = new Student(first8.Text, last8.Text, Convert.ToInt32(score8.Text));
if (first9.Text != empty & score9.Text != empty & last9.Text != empty)
{
student9 = new Student(first9.Text, last9.Text, Convert.ToInt32(score9.Text));
if (first10.Te
textbox has information in it, I use a lot of if statements. Is there a cleaner way to do this?```
public void CheckData()
{
if (first1.Text != empty & score1.Text != empty & last1.Text != empty &
first2.Text != empty & score2.Text != empty & last2.Text != empty &
first3.Text != empty & score3.Text != empty & last3.Text != empty &
first4.Text != empty & score4.Text != empty & last4.Text != empty &
first5.Text != empty & score5.Text != empty & last5.Text != empty)
{
student1 = new Student(first1.Text, last1.Text, Convert.ToInt32(score1.Text));
student2 = new Student(first2.Text, last2.Text, Convert.ToInt32(score2.Text));
student3 = new Student(first3.Text, last3.Text, Convert.ToInt32(score3.Text));
student4 = new Student(first4.Text, last4.Text, Convert.ToInt32(score4.Text));
student5 = new Student(first5.Text, last5.Text, Convert.ToInt32(score5.Text));
if (first6.Text != empty & score6.Text != empty & last6.Text != empty)
{
student6 = new Student(first6.Text, last6.Text, Convert.ToInt32(score6.Text));
if (first7.Text != empty & score7.Text != empty & last7.Text != empty)
{
student7 = new Student(first7.Text, last7.Text, Convert.ToInt32(score7.Text));
if (first8.Text != empty & score8.Text != empty & last8.Text != empty)
{
student8 = new Student(first8.Text, last8.Text, Convert.ToInt32(score8.Text));
if (first9.Text != empty & score9.Text != empty & last9.Text != empty)
{
student9 = new Student(first9.Text, last9.Text, Convert.ToInt32(score9.Text));
if (first10.Te
Solution
The duplication problem can be solved using a custom UserControl, to encapsulate the controls used to edit a
To define the control:
After adding the user control, you can design it just like you would any other form. Add all the controls needed for a single Student: the three textboxes (for example,
Build your solution.
After that, on your form, instead of the 45 textboxes, place 15
Now, for the code part.
Your control needs to be able to read a student from its controls, so inside the
Now your
Doing this we've gained some advantages:
Student, as well as the validation.To define the control:
- right click you project in the Solution Explorer
- select Add -> UserControl...
- enter a name for the control (ex: StudentControl)
- press the Add button
After adding the user control, you can design it just like you would any other form. Add all the controls needed for a single Student: the three textboxes (for example,
txtFirstName, txtLastName and txtScore), as well as labels, if you consider necessary.Build your solution.
After that, on your form, instead of the 45 textboxes, place 15
StudentControls (you should find them in the Toolbox).Now, for the code part.
Your control needs to be able to read a student from its controls, so inside the
StudentControl class, add the following code:public Student GetStudent()
{
if (txtFirstName.Text == String.Empty ||
txtLastName.Text == String.Empty ||
txtScore.Text == String.Empty)
return null;
return new Student(txtFirstName.Text, txtLastName.Text, int.Parse(txtScore.Text));
}Now your
CheckData() method can be simplified like this:public void CheckData()
{
var students = Controls.OfType()
.Select(studentControl => studentControl.GetStudent())
.Where(student => student != null)
.ToList();
if(students.Count<5)
MessageBox.Show("You need a Minimum of 5 Students");
}Doing this we've gained some advantages:
- we've reduced the duplication. If some day you have to add a new field for a Student, you only have to add it once, not 15 times. Also, if tomorrow you need you form to hold 10 or 20 students, that's a simple operation to perform in the form designer, with no code implications.
- we've separated concerns: now the user control handles the logic of editing a single student, while the form only knows that it has some
StudentControlinstances that are used to somewhow constructStudentobjects.
- the code got significantly smaller. This means that anyone can read and understand it faster, thus leading to better maintainability.
Code Snippets
public Student GetStudent()
{
if (txtFirstName.Text == String.Empty ||
txtLastName.Text == String.Empty ||
txtScore.Text == String.Empty)
return null;
return new Student(txtFirstName.Text, txtLastName.Text, int.Parse(txtScore.Text));
}public void CheckData()
{
var students = Controls.OfType<StudentControl>()
.Select(studentControl => studentControl.GetStudent())
.Where(student => student != null)
.ToList();
if(students.Count<5)
MessageBox.Show("You need a Minimum of 5 Students");
}Context
StackExchange Code Review Q#11718, answer score: 8
Revisions (0)
No revisions yet.