无需DataTable实现Cascading combo box级联下拉的方案咨询
实现方案
该需求完全可以实现,无需依赖Sql.Data/DataTable组件,现有代码的问题主要是控件配置、语法和逻辑疏漏,修正后即可正常运行。
现有代码问题梳理
- 控件未开启回发:
rdpUnidade需要设置AutoPostBack="true"属性,否则选中值变更不会触发SelectedIndexChanged事件 - 方法定义错误:
rdpUnidade_SelectedIndexChanged方法被错误嵌套在Page_Load的!IsPostBack判断块内,属于无效语法,无法被系统调用 - 过滤逻辑未生效:你已经按单位ID筛选出了
InvUnidade人员集合,但最终给第二个下拉框绑定的还是全量人员数据,过滤结果没有被使用 - 绑定步骤不全:设置
DataSource后没有调用DataBind()方法让配置生效,也没有处理旧选项清空、默认空选项保留的逻辑
修正后代码
1. 前端控件配置(aspx)
<telerik:RadComboBox ID="rdpUnidade" runat="server" DataValueField="ID" DataTextField="NomeUnidade" AutoPostBack="true" OnSelectedIndexChanged="rdpUnidade_SelectedIndexChanged"> </telerik:RadComboBox> <telerik:RadComboBox ID="rdpInvestigador" runat="server" DataValueField="ID" DataTextField="Nome"> </telerik:RadComboBox>
2. 后台C#代码
protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { // 绑定第一个下拉框(单位) rdpUnidade.DataSource = new BLLUnidade().GetAll(); rdpUnidade.DataBind(); // 可选:给第一个下拉框也加默认空选项 rdpUnidade.Items.Insert(0, new RadComboBoxItem("", "")); // 初始化第二个下拉框,默认显示空选项 rdpInvestigador.Items.Insert(0, new RadComboBoxItem("", "")); } } private void rdpUnidade_SelectedIndexChanged(object sender, EventArgs e) { rdpInvestigador.Items.Clear(); // 单位未选中时只保留空选项 if (string.IsNullOrEmpty(rdpUnidade.SelectedValue)) { rdpInvestigador.Items.Insert(0, new RadComboBoxItem("", "")); return; } int unidadeId = Convert.ToInt32(rdpUnidade.SelectedValue); // 筛选对应单位的人员 var filteredInvestigadores = new BLLRecursoHumano().GetAll() .Where(rh => rh.id == unidadeId) .ToList(); rdpInvestigador.DataSource = filteredInvestigadores; rdpInvestigador.DataBind(); // 插入默认空选项 rdpInvestigador.Items.Insert(0, new RadComboBoxItem("", "")); }
Object Data Source实现方式参考
如果要用ObjectDataSource实现,只需要给rdpInvestigador绑定的ObjectDataSource设置SelectParameters,参数值取rdpUnidade的选中值,设置rdpUnidade的AutoPostBack="true"即可,无需手写事件逻辑。
内容的提问来源于stack exchange,提问作者harlem98
相关产品推荐
相关产品推荐

