ASP.NET 4.5中如何将Telerik多列ComboBox数据源转为指定类型
解决Telerik RadMultiColumnComboBox数据源转换及查找选中项问题
问题原因
RadMultiColumnComboBox在DataBind时,若配置了列绑定或指定了DataTextField/DataValueField,内部会自动将原始数据源投影为匿名类型,导致无法直接转换回原List<bob>类型。
解决方案
方案1:提前保存原始数据源(推荐)
在绑定控件时,把原始的List<bob>存储到ViewState或Session中,后续直接使用这个副本,无需从控件的DataSource属性读取:
// 绑定控件时保存原始数据源 List<bob> bobarray = ...; MyCombo.DataSource = bobarray; MyCombo.DataBind(); ViewState["OriginalBobData"] = bobarray; // 存入ViewState // 后续需要查找项时直接取出 var originalData = (List<bob>)ViewState["OriginalBobData"]; int targetIndex = originalData.FindIndex(item => item.id == targetGuid); if (targetIndex != -1) { MyCombo.SelectedIndex = targetIndex; }
方案2:通过动态类型/反射读取匿名类型属性
如果无法提前保存数据源,可利用dynamic类型访问匿名对象的属性,实现匹配查找:
var dataSource = ((IEnumerable<object>)MyCombo.DataSource).ToList(); Guid targetId = ...; // 要匹配的ID int targetIndex = -1; for (int i = 0; i < dataSource.Count; i++) { dynamic item = dataSource[i]; if (item.id == targetId) // 直接访问匿名类型的id属性 { targetIndex = i; break; } } if (targetIndex != -1) { MyCombo.SelectedIndex = targetIndex; }
如果dynamic无法正常工作(比如编译或运行时限制),可以用反射读取属性值:
var dataSource = ((IEnumerable<object>)MyCombo.DataSource).ToList(); Guid targetId = ...; int targetIndex = -1; for (int i = 0; i < dataSource.Count; i++) { var item = dataSource[i]; var idProperty = item.GetType().GetProperty("id"); if (idProperty != null) { Guid itemId = (Guid)idProperty.GetValue(item); if (itemId == targetId) { targetIndex = i; break; } } } if (targetIndex != -1) { MyCombo.SelectedIndex = targetIndex; }
方案3:利用控件自身的查找方法
确保已正确设置RadMultiColumnComboBox的DataValueField为id,然后直接使用FindItemByValue方法:
// 绑定前先设置DataValueField MyCombo.DataValueField = "id"; MyCombo.DataSource = bobarray; MyCombo.DataBind(); // 查找并设置选中项 Guid targetId = ...; var targetItem = MyCombo.FindItemByValue(targetId.ToString()); if (targetItem != null) { targetItem.Selected = true; }
内容的提问来源于stack exchange,提问作者AndyW
相关产品推荐
相关产品推荐

