如何在事件处理程序中停止执行数据获取和显示方法

时间:2019-04-22 06:46:21

标签: c# winforms event-handling

这是第一次在这里问问题,而不是英语本地人。 因此,如果我的问题不明确,对此我感到抱歉。

[开发环境:Windows10,Visual Studio 2017,.net Framework 4.7.2]

我正在使用Windows窗体应用程序。 实现以下功能的最佳实践是什么。

在用户界面上,有4个组合框 cmbGradeFrom:从中选择成绩范围 cmbGradeTo:选择成绩范围 cmbClassFrom:从以下类别中选择课程范围 cmbClassTo:选择班级范围

更改每个组合框后,将执行每个事件处理程序, 在setEachFeeList()方法中,有一个SQL查询, 其中要获取的目标数据从cmbGradeFrom缩小到cmbGradeTocmbClassFromcmbClassTo。并在数据网格视图上显示数据。

如代码所示,如​​果您更改一个组合框的选择, 它影响另一个组合框的值。 因此,仅更改组合框的值一次有时会导致 执行setEachFeeList()方法。

我想使它就像我更改一个组合框值,其他三个组合框值更改一样, 并仅执行一次setEachFeeList()方法。 有什么办法可以实现这个功能?

我曾尝试使用bool vairiable来检查是否需要访问数据。 我尝试删除或添加事件处理程序来控制是否需要访问数据。

/// when cmbGradeFrom changed
protected void cmbGradeFrom_TextChanged(object sender, EventArgs e)
{
    if (cmbGradeFrom.Items.Count == 0 || cmbGradeTo.Items.Count == 0) return;

    if (cmbGradeFrom.SelectedIndex > cmbGradeTo.SelectedIndex) 
    {
        cmbGradeTo.SelectedIndex = cmbGradeFrom.SelectedIndex;
    }

    /// when cmbGradeFrom and cmbGradeTo are the same, set default cmbClassFrom and cmbClassTo
    if (cmbGradeTo.SelectedIndex == cmbGradeFrom.SelectedIndex)
    {
        setClassFromTo();
    }
    else
    {
        //get data using sql and display
        setEachFeeList(); 
    }
}

/// when cmbGradeTo changed
protected void cmbGradeTo_TextChanged(object sender, EventArgs e)
{
    if (cmbGradeFrom.Items.Count == 0 || cmbGradeTo.Items.Count == 0) 
    return;

    if (cmbGradeFrom.SelectedIndex > cmbGradeTo.SelectedIndex)
    {
        cmbGradeFrom.SelectedIndex = cmbGradeTo.SelectedIndex;
    }

    /// when cmbGradeFrom and cmbGradeTo are the same, set default cmbClassFrom and cmbClassTo
    if (cmbGradeFrom.SelectedIndex == cmbGradeTo.SelectedIndex)
        setClassFromTo(); 
    }
    else
    {
        //get data using sql and display
        setEachFeeList(); 
    }
}
/// when cmbClassFrom changed
protected void cmbClassFrom_TextChanged(object sender, EventArgs e)
{
    if (cmbClassFrom.Items.Count == 0 || cmbClassTo.Items.Count == 0) return;

    if (cmbClassFrom.SelectedIndex > cmbClassTo.SelectedIndex) 
    {
        cmbClassTo.SelectedIndex = cmbClassFrom.SelectedIndex;
    }
    //get data using sql and display
    setEachFeeList();
}
/// when cmbClassTo changed
protected void cmbClassTo_TextChanged(object sender, EventArgs e)
{
    if (cmbClassFrom.Items.Count == 0 || cmbClassTo.Items.Count == 0) return;

    if (cmbClassFrom.SelectedIndex > cmbClassTo.SelectedIndex) 
    {
        cmbClassFrom.SelectedIndex = cmbClassTo.SelectedIndex;
    }
    //get data using sql and display
    setEachFeeList();
}

0 个答案:

没有答案