无法在Winform的事件处理程序中传递null参数?

时间:2019-04-25 13:13:51

标签: c# .net winforms entity-framework

我希望随后对我的搜索应用过滤器说“如果我将10K作为myFee值,它将显示所有包含10K费用的主题,但是如果在此之后我给出2014年,它将显示同时应用费用和年约束的结果< / p>

当前,如果我同时在两个comboBoxes上给出值(费用和年份),我将得到正确的结果 [下方图片] https://imgur.com/a/dYpCeeP

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

            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;
        }
    }

如果要随后在搜索中应用过滤器。但是,它适用于按搜索按钮一次进行的搜索,但是如果我尝试仅对搜索应用“费用”约束,而将“年”约束保留为空,则会立即给我例外。

1 个答案:

答案 0 :(得分:0)

如果items.Name.AcademyContains("_courseInputBox") || items.Name.AcademyContains("_feeInputBox")

,您的where子句会同时检查年份和费用

因此,如果您的学院包含courseinputbox OR feeinputbox,它将运行where子句。因此,如果Academy包含courseinputbox但不包含feeinputbox,则您的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();
}