ListBox显示唯一标签后SelectedIndexChanged事件类型转换问题求助
问题解决方案
原因很明确:你在LoadContent方法里把ListBox的数据源设置成了仅包含Label字符串的列表(通过Select(a => a.Label).Distinct()),所以SelectedItem返回的是string类型,自然无法强制转换为TDFnEtlGetTargetVariable对象。
要解决这个问题,需要保证ListBox的数据源仍是TDFnEtlGetTargetVariable类型的集合,同时确保显示的Label唯一。可以通过分组去重实现:
1. 修改LoadContent方法
public void LoadContent() { TDFnEtlGetTargetVariableList tdFnEtlGetTargetVariableList = TDFunctions.FnEtlGetTargetVariable.Execute(database, SelectedExportConnectionId, lang, false); // 按Label分组,取每个分组的第一个元素,既保证Label唯一又保留完整对象 var uniqueItems = tdFnEtlGetTargetVariableList.Items .GroupBy(item => item.Label) .Select(group => group.First()) .ToList(); lstTargetVariable.DataSource = uniqueItems; lstTargetVariable.DisplayMember = "Label"; // 绑定显示Label属性 }
2. 调整SelectedIndexChanged事件(增加空值判断更稳妥)
现在lstTargetVariable.SelectedItem的类型就是TDFnEtlGetTargetVariable,强制转换不会再报错:
private void LstTargetVariable_SelectedIndexChanged(object sender, EventArgs e) { if(lstTargetVariable.SelectedItem == null) return; TDFnEtlGetTargetVariable selectedTargetVariable = (TDFnEtlGetTargetVariable)lstTargetVariable.SelectedItem; TargetVariableMetadataJson targetVariableMetadataJson = new TargetVariableMetadataJson(); targetVariableMetadataJson.LoadFromText(selectedTargetVariable.MetadataString); cmbStateOrChange.DataSource = targetVariableMetadataJson.Data; cmbStateOrChange.DisplayMember = "state_or_change_label_cz"; cmbUnit.DataSource = targetVariableMetadataJson.Data; cmbUnit.DisplayMember = "unit_label_cz"; }
补充说明
如果同一个Label对应的多个对象存在业务差异(比如MetadataString内容不同),你需要根据实际需求调整分组后的取值逻辑(比如group.Last()或自定义筛选规则),确保后续业务逻辑的正确性。
内容的提问来源于stack exchange,提问作者Jana
相关产品推荐
相关产品推荐

