WebForm DropDownList索引8、9异常,选中后索引跳转求助
问题:DropDownList选中特定州时索引跳转异常
在WebForm页面中使用DropDownList控件加载美国州名(从XML文件读取),触发OnSelectedIndexChanged事件时,选中索引8的Delaware、索引9的Florida时,索引会跳转为7(对应Connecticut),其余州正常。即使把这两个州移到索引51、52位置,问题依旧,XML文件标签无缺失。
XML文件数据片段
<state name="Delaware" abs="DE"> <id>8</id> <counties> <county id="1">Kent</county> <county id="2">New Castle</county> <county id="3">Sussex</county> </counties> </state> <state name="Florida" abs="FL"> <id>9</id> <counties> <county id="1">Alachua</county> <county id="2">Baker</county> <county id="3">Bay</county> <county id="4">Bradford</county> <county id="5">Brevard</county> <county id="6">Broward</county> </state>
页面控件代码
<asp:DropDownList ID="ddlState" CssClass="form-control" runat="server" OnSelectedIndexChanged="ddlState_SelectedIndexChanged" AutoPostBack="true" TabIndex="0"></asp:DropDownList>
后台代码
选中事件处理
protected void ddlState_SelectedIndexChanged(object sender, EventArgs e) { int nodeid = ddlState.SelectedIndex; ddStateComm.SelectedIndex = nodeid - 1; countyfill(nodeid, sender); countyfill(ddStateComm.SelectedIndex + 1, ddStateComm); txtZipcode.Focus(); }
填充郡列表逻辑
protected void countyfill(int id, object sender) { XmlDocument doc = new XmlDocument(); doc.Load(MapPath("~/App_Data/counties.xml")); XmlNodeList ing = doc.SelectNodes("states/state[id = " + id + "]/counties/*"); if (sender.Equals(ddStateComm)) { lstCounties.Items.Clear(); for (int i = 0; i < ing.Count; i++) { lstCounties.Items.Add(new ListItem(ing.Item(i).InnerText)); } } else { dpdCounty.Items.Clear(); for (int i = 0; i < ing.Count; i++) { dpdCounty.Items.Add(new ListItem(ing.Item(i).InnerText)); } } }
解决方案
核心问题
你直接用ddlState.SelectedIndex作为XML查询的id,但DropDownList的索引是加载时的顺序,和XML里的<id>不一定完全对应。当移动州的位置时,索引改变但XML的<id>未变,导致查询错位;另外PostBack时如果控件未正确绑定,也会引发索引混乱。
修复步骤
绑定DropDownList时关联XML的
<id>
在Page_Load中添加绑定逻辑(注意判断!IsPostBack避免重复绑定),将XML的<id>设为列表项的Value,州名设为Text:protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { XmlDocument doc = new XmlDocument(); doc.Load(MapPath("~/App_Data/counties.xml")); XmlNodeList stateNodes = doc.SelectNodes("states/state"); foreach (XmlNode stateNode in stateNodes) { string stateName = stateNode.Attributes["name"].Value; string stateId = stateNode.SelectSingleNode("id").InnerText; ddlState.Items.Add(new ListItem(stateName, stateId)); ddStateComm.Items.Add(new ListItem(stateName, stateId)); } } }修改事件逻辑,用
SelectedValue获取正确ID
不再依赖索引,直接取选中项的Value(即XML的<id>)进行操作:protected void ddlState_SelectedIndexChanged(object sender, EventArgs e) { int stateId = int.Parse(ddlState.SelectedValue); ddStateComm.SelectedValue = ddlState.SelectedValue; countyfill(stateId, sender); countyfill(stateId, ddStateComm); txtZipcode.Focus(); }检查XML完整性
你提供的Florida片段未闭合</counties>和</state>标签,需确保整个XML文件所有标签都正确闭合,否则XmlDocument解析出错会导致节点顺序混乱。
额外建议
- 避免每次调用
countyfill都重新加载XML,可将内容缓存到Application或Session提升性能; - XPath查询可添加类型判断(如
id = number(8)),避免字符串匹配出错。
内容的提问来源于stack exchange,提问作者ACME NOTARY
相关产品推荐
相关产品推荐

