控件能否绑定双数据源?DetailsView编辑时DropDownList绑定报错求助
问题解答
第一个问题:是否属于单个控件绑定两个不同数据源?
先给你明确答案:这不属于单个控件绑定两个数据源的情况。
DetailsView本身绑定SqlDataSource作为它的数据源,而你在EditItemTemplate里放置的DropDownList,是DetailsView的子控件——它自己独立绑定XmlDataSource,两者是父容器和子控件的关系,各自有独立的数据源绑定逻辑,不存在“同一个控件绑定两个数据源”的冲突。
第二个问题:如何正确绑定DropDownList并避免报错?
要实现保存选中值且不出现SelectedValue不在列表中的错误,你需要做好以下几个关键步骤:
1. 正确配置DropDownList和XmlDataSource
首先确保XmlDataSource能正确读取你的XML数据,同时给DropDownList指定对应的显示字段和值字段:
<asp:DetailsView ID="DetailsView1" runat="server" DataSourceID="SqlDataSource1" AutoGenerateEditButton="True"> <EditItemTemplate> <asp:DropDownList ID="DropDownList1" runat="server" DataSourceID="XmlDataSource1" DataTextField="DisplayText" DataValueField="Value"> <asp:ListItem Text="请选择" Value=""></asp:ListItem> </asp:DropDownList> <asp:XmlDataSource ID="XmlDataSource1" runat="server" DataFile="~/Data/Options.xml" XPath="/Options/Option"></asp:XmlDataSource> </EditItemTemplate> </asp:DetailsView> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:YourConnString %>" SelectCommand="SELECT * FROM YourTable" UpdateCommand="UPDATE YourTable SET YourColumn = @SelectedValue WHERE ID = @ID"> <UpdateParameters> <asp:Parameter Name="ID" Type="Int32" /> <asp:ControlParameter Name="SelectedValue" ControlID="DropDownList1" PropertyName="SelectedValue" Type="String" /> </UpdateParameters> </asp:SqlDataSource>
注意:XmlDataSource的XPath要匹配你的XML结构,DropDownList的DataTextField和DataValueField要对应XML节点里的属性或文本;添加空值默认项能避免空值或不匹配值导致的报错。
2. 在DetailsView绑定后,给DropDownList设置选中值
编辑时,DetailsView会加载当前行的数据,这时候需要把对应字段的值赋值给DropDownList,但必须先检查这个值是否存在于DropDownList的选项中,否则会触发报错。你可以在DetailsView的DataBound事件里处理:
protected void DetailsView1_DataBound(object sender, EventArgs e) { if (DetailsView1.CurrentMode == DetailsViewMode.Edit) { DropDownList ddl = (DropDownList)DetailsView1.FindControl("DropDownList1"); if (ddl != null) { // 获取DetailsView当前行的对应字段值 object rawValue = DetailsView1.DataItem["YourColumn"]; string currentValue = rawValue != DBNull.Value ? rawValue.ToString() : string.Empty; // 检查值是否存在于DropDownList的选项中 ListItem targetItem = ddl.Items.FindByValue(currentValue); if (targetItem != null) { ddl.SelectedValue = currentValue; } else { // 若不存在,选中默认项 ddl.SelectedIndex = 0; } } } }
3. 确保SqlDataSource能正确获取DropDownList的选中值
在SqlDataSource的UpdateParameters里,用ControlParameter绑定DropDownList的SelectedValue(如上面代码所示),这样更新时就能把选中值正确传到数据库中。
额外提示:
- 确保XML文件路径正确、网站有读取权限,否则XmlDataSource无法加载数据,DropDownList会因无选项触发报错。
- 如果数据库字段值可能为
NULL,一定要在后台代码里判断rawValue是否为DBNull.Value,避免空引用异常。
内容的提问来源于stack exchange,提问作者Anand
相关产品推荐
相关产品推荐

