首页 > 解决方案 > 无法在 winform 的事件处理程序中传递空参数?

问题描述

我想随后对我的搜索应用过滤器说“如果我将 10K 作为 myFee 值,它应该显示所有具有 10K 费用的科目但是如果在此之后我给出 2014 年,它应该显示同时应用费用和年份约束的结果

目前,如果我同时在两个组合框上给出值(费用和年份),我会得到正确的结果 [下图] https://imgur.com/a/dYpCeeP

在这里,我们使用参数调用 GetStudentsByYearEF,但是如果我尝试将任何输入留空,它会在作为参数传递时出错。

            string _readYear = _yearInputBox?.SelectedItem.ToString();
            var _readFee = _feeInputBox?.SelectedItem.ToString();
            var readfee = Convert.ToInt32(_readFee);
            if (_readYear != string.Empty && readfee != null && readfee > 0)
            {
                var students = AcademyHelper.GetStudentsByYearEF(readfee, _readYear, this.dataGridView2, this, this.groupBox5);
                this.dataGridView2.DataSource = students;
            }

GetStudentsByYearEF() 的定义

    public static IEnumerable<Student> GetStudentsByYearEF(int fee, string year, DataGridView dtg, Form form, GroupBox groupbox)
    {
        List<Student> searchedStudent = new List<Student>();
        using (var retrive = new Models.Academy_MSDBEntities())
        {
            foreach (Control items in groupbox.Controls)
            {
                //removed .tolower() from here
                if (items.Name.AcademyContains("_courseInputBox") || items.Name.AcademyContains("_feeInputBox"))
                {
                    var query = retrive.Students
                     .Where(s => s.Year == year && s.Fees==fee).ToList();
                    searchedStudent.AddRange(query);
                    retrive.SaveChanges();
                }
            }
            return searchedStudent;
        }
    }

如果想随后对搜索应用过滤器。但是,它适用于在按下搜索按钮时立即进行搜索,但是如果我尝试仅对搜索应用费用约束并将年份约束留空,我会立即给我例外。

标签: c#.netwinformsentity-framework

解决方案


您的 where 子句检查年份和费用 ifitems.Name.AcademyContains("_courseInputBox") || items.Name.AcademyContains("_feeInputBox")

因此,如果您的 Academy 包含courseinputboxfeeinputbox,它将运行 where 子句。因此,如果 Academy 包含 courseinputbox 但不包含 feeinputbox,您的 where caluse 将尝试使用费用值进行过滤。

在运行 where 子句之前,您需要为费用添加一个空检查。就像是:

if(fee != null){
                 var query = retrive.Students
                 .Where(s => s.Year == year && s.Fees==fee).ToList();
                searchedStudent.AddRange(query);
                retrive.SaveChanges();
}else{                                                              
               var query = retrive.Students
                 .Where(s => s.Year == year).ToList();
                searchedStudent.AddRange(query);
                retrive.SaveChanges();
}

推荐阅读