- Repeater一般只用来展示数据,如果要增删改则用ListView更方便,使用向导(强类型数据)来使用ListView会自动生成很多模板,免去手写模板代码的麻烦,再进行手工调整即可。
- 首先设定数据源,然后点击智能提示中的“配置ListView”,选择一种布局和样式,然后根据需要勾选“启用编辑”、"启用删除”、“启用插入”、“启用分页”,就会自动生成常用的模板,注意,这只是提高效率的一个方式并不 是唯一选择。
- LayoutTemplate为布局模板,布局模板中必须有一个ID为itemPlaceholder的服务端控件(4.0后不需要).什么类型无所谓,不会被显示,itemPlaceholder前面就是相当于Repeater中的HeaderTemplater,itemPlaceholder后面就是相当于Repeater中的FooterTemplate,因此ListView中没有这两个模板。
- itemTemplate是每一项的模板,AlternatingItemTemplate是隔行显示的模板,和Repeater一样,EmptyDataTemplate为数据源没有数据的时候显示的内容,这样的话可以实现“没有查找结果”等信息。InsertItemTemplate为插入数据界面的模板,EditItemTemplate为编辑数据的模板,SelectedItemTemplate为标记为Selected的行的模板。
- EditItemTemplate、InsertItemTemplate中的控件的绑定表达式为Text='<%#Bind("Age")%>',因为Eval只是计算表达的值输出,而Bind不仅可以计算表达式的值输出,还可以将用户填入的值更新到数据库中,因此Eval是单向绑定,Bind是双向绑定的。
- 通过每行的Insert、Delete、Edit、Cancel等Command进行增删改,这几个CommandName被ListView内部处理,不需要开发人员处理,因此自定义的CommandName不要和他们重复。ListView中可以像Repeater那样为行增加Command按钮,处理方法和Repeater一样,ListView也支持Repeater那样的ItemDataBound事件。
- ListView中可以使用Validator,只要将Validator放入相应的模板中,将Validator手动设为要验证的控件的Id,然后设定相应按钮、控件、Validator为同样的ValidationGroup,防止不同模板中的Validator互相干扰。将Cancel按钮的CausesValidation="false"即不触发验证事件。
- 在ItemDataBound事件中,判断数据行的类型是e.Item.ItemType=ListViewItemType.DataItem. 取得行对应的DataRowView: ListViewDataItem lvDataItem=(ListViewDataItem)e.item; DataRowView rowview=(DataRowView)lvDataItem.DataItem; 在FindControl的时候注意AlternatingItemTemplate的问题。
- 新增数据行的默认值:响应ListView的ItemCreated事件,当e.Item.ItemType为InsertItem的时候通过FindControl找到控件然后初化控件的值即可。
- ObjectDataSource绑定Id为Guid类型的表的时候会生成一个"DataObjectTypeName="System.Guid"",这是C#的bug,删掉就可以了。
- 插入数据的初始化:注意和“新增数据行”不同,“插入数据的初始化”是在用户点击“插入按钮”之后执行。比如主键为Guid,则需要在数据插入数据库之前为主赋值。响应ListView的ItemInserting事件,e.Values为所有字段的键值对,可以读取插入的值,也可以向字段中写值,这样就可以为id赋值如:e.Values["Id"]=Guid.NewGuid().在这个事件中对数据进行检验,也可以通过e.Cancel=True来取消非法数据插入。
- 更新之前的处理:就像数据插入前可以在ItemInserting事件中处理一样,也可以在ItemUpdating事件中对更新过程进行处理,e.ItemIndex可以取到当前更新行的行号,e.OldValues可以取到更新前的值,e.NewValues可以取到更新后的值,可以通过e.Cancel=true来取消非法数据插入。