现象:我有一个像字典表一样的表,他不属于字典表,他是方便客户录入的,里面有一些值,这些值是直接写进别的表里的,在这个表更新的时候,已经写入到别的表里面的值是不会跟着更新的
这个表里的记录,用户可以随时添加修改删除,他在整个系统里,没有数据完整性的要求,他只是用来给一些打字很慢的用户提供方便用的
在录入修改数据的时候,有些字段要用到这个表,使用的是DropDownList控件,在修改数据时,因为那个表的数据是可以随便更新的,所以经常会出现字段的值在那个字典表里不存在的情况,这时就会报错:DropDownList 有一个无效 SelectedValue
我的解决办法:
不要在模版列时直接设置字段的绑定属性
<EditItemTemplate>
<asp:DropDownList ID="DropDownList19" runat="server" DataSourceID="ObjectDataSource11" DataTextField="FileTitle" DataValueField="FileTitle"></asp:DropDownList>
<asp:Label ID="Label7" runat="server" Text='<%# Eval("FileTitle") %>' Visible="False"></asp:Label>
</EditItemTemplate>
Bind是双向绑定,就是数据会自动取出来,更新时也会自动写进数据库,如果是使用Eval方法,是单向绑定,就是数据会自动读取,不会自动更新进数据库,我上面的定义,对Label就使用了Eval方法,因为我只是要把字段的值读取出来使用
为了解决出现“DropDownList 有一个无效 SelectedValue”的问题,在这里,不可以对SelectedValue做绑定的设置
这样呢,DropDownList就是一个用来显示数据的控件了,他不会自动和模版列里的数据挂上勾
现在要处理的是两个地方:
1、刚刚进入编辑状态的时候,要设置DropDownList控件的默认值和字段内容一样,在DetailsView3_DataBound事件里设置就可以了
这段代码就是借读取Label7的Text,查DropDownList里有没有现在的值,如果没有,就添加一个ListItem项,保证有设置SelectedValue时,DropDownList里这个值,避开出错
2、更新的时候,要把数据写进数据库,在DetailsView3_ItemUpdating事件里设置:
mydl=(DropDownList)DetailsView3.FindControl("DropDownList19");
if (mydl != null)
{
e.NewValues["FileTitle"] = mydl.Items[mydl.SelectedIndex].Value;
}