按钮事件在结束或启动时不会在单击时触发

时间:2017-09-14 10:11:07

标签: c# wpf

我的应用程序工作正常,但我错过了一次点击。当我到达列表的末尾并想要转到上一个项目时,我想按两次前一个按钮,错过一次点击。当从上一个项目到最后一个项目时,前一个按钮的相同位置是我的学生班级代码。

public student(string Firstname,string Lastname,string City)
{
    this.Firstname = Firstname;
    this.Lastname = Lastname;
    this.City = City;
}
public static List<student> listofstudents = new List<student>();
public static int i = 0;

我只是使用此代码在列表中添加学生。

private void btnCreateStudent_Click(object sender, RoutedEventArgs e)
{
   student.listofstudents.Add(new student(txtFirstName.Text, txtLastName.Text, 
                                                          txtCity.Text));
   txtCity.Clear();
   txtFirstName.Clear();
   txtLastName.Clear();
   student.i = -1;
}

我的下一个按钮的代码

private void btnNext_Click(object sender, RoutedEventArgs e)
{
    student.i++;
    if (student.i < student.listofstudents.Count )
    {             
        txtFirstName.Text = student.listofstudents[student.i].Firstname;
        txtLastName.Text = student.listofstudents[student.i].Lastname;
        txtCity.Text = student.listofstudents[student.i].City;           
    }

    else 
    {
        MessageBox.Show("list is full");
    }

}

我前一个按钮的代码

private void btnPrevious_Click(object sender, RoutedEventArgs e)
{
    student.i--;
    if (student.i >=0)
    {                 
        txtFirstName.Text = student.listofstudents[student.i].Firstname;
        txtLastName.Text = student.listofstudents[student.i].Lastname;
        txtCity.Text = student.listofstudents[student.i].City;
    }
    else
    {          
        MessageBox.Show("no data");
    }
}

1 个答案:

答案 0 :(得分:0)

您的问题是一个简单的逻辑错误。让我们假设您只有两个学生条目,然后按照您的描述继续前进:

[button next clicks]
i = 0 --> show first student data
i = 1 --> show second student data
i = 2 --> show message and still show unchanged second student data

[button previous clicks]
i = 1 --> show second student data (that where already visible from i = 2)
i = 0 --> show first student data

解决方案很简单:每当您显示消息框时,您都会继续显示之前student.i值的学生数据。因此,当超出范围时,您应该撤消对student.i的更改:

private void btnNext_Click(object sender, RoutedEventArgs e)
{
    student.i++;
    if (...)
    { ... }
    else 
    {
        MessageBox.Show("list is full");
        student.i--; // undo change
    }
}

private void btnPrevious_Click(object sender, RoutedEventArgs e)
{
    student.i--;
    if (...)
    { ... }
    else
    {          
        MessageBox.Show("no data");
        student.i++; // undo change
    }
}