HiveBrain v1.2.0
Get Started
← Back to all entries
patterncsharpMinor

Saving student scores

Submitted by: @import:stackexchange-codereview··
0
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 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 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 StudentControl instances that are used to somewhow construct Student objects.



  • 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.