标签:
野生程序猿 | 发表时间:2020-07-20 17:26:52 | 更新时间: 2020-09-24 12:28:02 | 阅读数:644 | 评论数:0 | 字数:1149
有这样一个需求,在页面上点击查询按钮,根据dropdownlist选中的内容查询数据库中的数据,查询到的数据返回到当前页面的table中。
我采用的方法是这样的,在URL中加入查询字段,加载页面时按URL查询字段写command的查询语句。这时候是可以返回正确的查询结果的,这里没有任何问题。但是页面刷新后dropdownlist会显示默认的项,而非查询前选中的项,这就很反人类了。
很自然的,这时候我们需要写上个什么语句,让dropdownlist的内容显示查询的项,通常想到的是:
dropdownlist.text=request.querystring("xxx")
或者:
dropdownlist.Items.FindByText(request.querystring("xxx")).Selected=True
上面是从网上找到的方法,看起来很简单。
可是,ASP.NET有个奇怪的特性,就是在使用Response.Redirect重定向到当前页面,首先运行的是Page_Load事件,不管你再在Button_Click里面写什么都没有用。
写到Page_Lode中呢?也没啥用,dropdownlist还是显示默认项。
这个问题困扰了我整个一个周末,到网上搜了好久,也找不到答案。有些人甚至将其归咎于ASP.NET的天生缺陷。
ASP.NET确实不好用,没有JS的加持,简直什么也干不了。
我甚至想到了一个异常复杂的曲线救国方案来解决这个问题,但是测试后仍旧是达不到预想的效果。
简直就要放弃的时候,歪打正着的想到了解决方案,而且确实也很简单:
方法就是把设置dropdownlist选中项的语句写到页面的页面的LoadComplete事件中,也就是等整个页面加载完成,我们再设置dropdownlist的内容。这个方法之前也想到了,只不过当时用的是findbytext,但是总是引起未设置对象什么什么的错误,注意力都放到解决这个错误了。其实,用dropdownlist.text=request.querystring("xxx")就行了。
野生程序猿解决起困难来就是这么漫无目的的佛系为之,可笑加无奈。
但是问题终归是解决了吧,是以记之。
今天(7.15)在写IIS日志查看器的时候,又遇到了这个问题,发现有可能是用的列表控件的item.clear方法导致的问题。因为每次postback,列表控件都会加载一次数据,造成列表内容重复,所以在add item之前使用clear方法清空内容,但是这样就导致了每次postback列表控件内容就会初始化,也就会造成在postback之后不会保持原来选择的内容。解决的办法也相对简单,首先就是不要用clear方法,而是在add item之前使用isPostback判断。