c# - 如何在事件处理程序中停止执行数据获取和显示方法
问题描述
这是第一次在这里提出问题,而不是英语母语。因此,如果我的问题模棱两可,我很抱歉。
【开发环境:Windows10、Visual Studio 2017、.net framework 4.7.2】
我正在开发一个 Windows 窗体应用程序。实现以下功能的最佳实践是什么。
在用户界面上,有 4 个组合框
cmbGradeFrom
: 选择年级范围 from
cmbGradeTo
:选择年级范围 to
cmbClassFrom
:选择班级范围 from
cmbClassTo
:选择班级范围 to
一旦每个组合框发生变化,每个事件处理程序都会执行,并且在方法中,有一个 sql 查询,其中要获取的目标数据从to
和 from tosetEachFeeList()
缩小。并在数据网格视图上显示数据。cmbGradeFrom
cmbGradeTo
cmbClassFrom
cmbClassTo
正如代码所说,如果您更改一个组合框的选择,它会影响另一个组合框的值。所以仅仅改变一次组合框的值有时会导致执行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();
}
解决方案
推荐阅读
- ruby-on-rails - 我应该使用 Rails 来保持一致性吗?(对于 ETL 项目)
- php - Vue + Laravel 不发送电子邮件 - 没有收到任何错误
- reactjs - React Hooks - 如何使用useEffect之外的变量声明来定位元素子(使用useRef)?
- java - 在 Visual Studio Code 中禁用带有类名的注释
- django - 在 django rest 框架中删除多个对象
- c# - 什么是 F# 的标准类型事件?
- vb.net - 运行时移除图片,只移除一张图片上的两张
- flask-sqlalchemy - 如何将postgresql查询转换为flask sql alchemy
- javascript - 在两种颜色之间切换不起作用
- redis - 获取按设置值过滤的 Redis 键