ComboBox初始取值正常,切换选项时类型转换报错求助
解决ComboBox切换选项时的类型转换异常问题
我来帮你分析下这个问题的原因,然后给出解决办法:
首先,你遇到的异常是因为对SelectedValue的用法理解有点偏差。当你给ComboBox设置了ValueMember = "CorporationId"之后,SelectedValue属性返回的直接就是对应项的CorporationId值——也就是Guid类型,而不是整个Corporation对象。
为什么初始化时看似正常,切换就报错?
窗体刚初始化绑定数据源时,SelectedItem是第一个Corporation对象,这时候你强行把SelectedValue转成Corporation碰巧没报错,但这其实是错误的用法。等你切换ComboBox选项后,SelectedValue会正确返回选中项的Guid值,这时候再试图把Guid转成Corporation对象,自然就抛出类型转换异常了。
而你尝试的var corpid = (Guid) comboBox_CompanyId.SelectedValue在初始化时报错,是因为窗体初始化阶段ComboBox可能还没有选中项,SelectedValue为null,直接强制转换就会出错。
解决方案
这里有两种靠谱的写法,你可以根据需求选择:
方法1:直接使用SelectedValue获取Guid(推荐,因为你只需要ID值)
修改SelectedIndexChanged事件代码,先判断SelectedValue是否为空,再转换为Guid:
private void comboBox_CompanyId_SelectedIndexChanged(object sender, EventArgs e) { using (var ent = new SuburbanPortalEntities()) { // 先判断SelectedValue是否为空,避免初始化时的空引用问题 if (comboBox_CompanyId.SelectedValue == null) return; var corpid = (Guid)comboBox_CompanyId.SelectedValue; if (corpid == Guid.Empty) return; var qry = (from x in ent.Trucks where x.CorporationId == corpid orderby x.TruckNumber select x).ToList(); if (!qry.Any()) { // 清空卡车ComboBox,避免残留旧数据 comboBox_TruckNumber.DataSource = null; return; } comboBox_TruckNumber.DataSource = qry; comboBox_TruckNumber.DisplayMember = "TruckNumber"; comboBox_TruckNumber.ValueMember = "TruckId"; } }
方法2:通过SelectedItem获取整个Corporation对象
如果你需要用到Corporation的其他属性,这种写法更直观:
private void comboBox_CompanyId_SelectedIndexChanged(object sender, EventArgs e) { using (var ent = new SuburbanPortalEntities()) { // 用as转换,避免强制转换抛出异常 var selectedCorp = comboBox_CompanyId.SelectedItem as Corporation; if (selectedCorp == null) return; var corpid = selectedCorp.CorporationId; if (corpid == Guid.Empty) return; var qry = (from x in ent.Trucks where x.CorporationId == corpid orderby x.TruckNumber select x).ToList(); if (!qry.Any()) { comboBox_TruckNumber.DataSource = null; return; } comboBox_TruckNumber.DataSource = qry; comboBox_TruckNumber.DisplayMember = "TruckNumber"; comboBox_TruckNumber.ValueMember = "TruckId"; } }
这两种写法都能解决你的问题,而且逻辑更清晰,不会出现类型转换的异常。
内容的提问来源于stack exchange,提问作者ErocM
相关产品推荐
相关产品推荐

