需求的产生:公司要求用系统对产品价格实现全球控管,在价格管理模块要求动态产生输入表单,其效果就像Excel的操作一样,具体见下图:
“1”控制红框范围内表单“2”的生成(不同产品线有不固定数量的产品所致)
“3”控制蓝框范围内表单“4”的生成(不同产品在同一段时间内定价策略各异)
解决方案:
“2”中除“4”部分表单采取Web控件
“4”中表单采取Html代码模拟。
经过摸索发现,动态产生的Web控制,只要控件ID相同,刷新之后是可以保留状态信息的(先在Aspx的Page中加入EnableViewState=true),所以现在要解决的问题就是需要有一个隐藏控件ItemCount记录有多少个“2”产生了,ItemCount是拉进来的非动动的控件,状态信息可以保留,所以“1”所做的动作其实就是给ItemCount的记数自加,然后在Page_Load的时候循环产生“2”,记得所有控件应该有规律(控件类型_控件意义_行号)的生成标识即控件ID。
“3”对“4”的生成需要用Hmtl代码来模拟,原本想过也用Web控件,最终研究的结果是动态控件中的动态控件没有办法保留状态信息,所以这里的状态信息以及表单本身都只能模拟出来。所以又要拖进来一个控件PriceValue来保存价格信息,存储格式“行号1,价钱1,日期1|行号2,价钱2,日期2……”,后台要完成两个动作,一个是拼出如此格式的字符串,另外就是根据数据库的价格信息模拟出价格输入表单。要注意的就是,任何一个价格表单的改动都应该触发一个客户端脚本,重新遍历一下所有的价格表单,然后重写PriceValue的信息,这样才能保证价格信息即时保存下来,才人会在页面刷新的时候丢失。
虽然上面讲的很简单,但实际开发的时候有许多细节需要考虑,比如一个简单的删除可能就会打乱规律,要作特殊处理,另外图片选择信息用户也要求保留(文件选择框一刷文件选择信息就没了,天经地义)……最后这一个页面的后台编码写了近三千行,实在是很失败,但用户想要的都实现了,用户却满意了……