首页 > 解决方案 > 如何在事件处理程序中停止执行数据获取和显示方法

问题描述

这是第一次在这里提出问题,而不是英语母语。因此,如果我的问题模棱两可,我很抱歉。

【开发环境:Windows10、Visual Studio 2017、.net framework 4.7.2】

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

在用户界面上,有 4 个组合框 cmbGradeFrom: 选择年级范围 from cmbGradeTo:选择年级范围 to cmbClassFrom:选择班级范围 from cmbClassTo:选择班级范围 to

一旦每个组合框发生变化,每个事件处理程序都会执行,并且在方法中,有一个 sql 查询,其中要获取的目标数据从to 和 from tosetEachFeeList()缩小。并在数据网格视图上显示数据。cmbGradeFromcmbGradeTocmbClassFromcmbClassTo

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

我想让它好像我改变一个组合框值,其他三个组合框值改变,并且setEachFeeList()只执行一次方法。有没有办法实现这个功能?

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

/// 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();
}

标签: c#winformsevent-handling

解决方案


推荐阅读