有的时候DataGrid取值取不到? (四种取值方法)

本文介绍ASP.NET中DataGrid不同列类型的取值方法,包括绑定列、模板列及Label控件等,并提供实际代码示例。

有的时候想取不是编辑状态的值,这个时候通常不会使用模板列中放置TextBox通过e.Item.FindControl取值,有的网友问为什么取不到?这要看你前台的列怎么写的了,下面分别写出四种情况和这四种情况下面的取值方式:

<asp:DataGrid id="DataGrid1" runat="server" AutoGenerateColumns="False" AllowPaging="True">
                
<Columns>
                    
<asp:BoundColumn DataField="vName" HeaderText="姓名0"></asp:BoundColumn>
                    
<asp:TemplateColumn HeaderText="姓名1">
                        
<ItemTemplate>
                            姓名
                        
</ItemTemplate>
                    
</asp:TemplateColumn>
                    
<asp:TemplateColumn HeaderText="姓名2">
                        
<ItemTemplate>
                            
<%#DataBinder.Eval(Container.DataItem,"vName")%>
                        
</ItemTemplate>
                    
</asp:TemplateColumn>
                    
<asp:TemplateColumn HeaderText="姓名3">
                        
<ItemTemplate>
                            
<asp:Label ID="name" Runat="server" Text='<%#DataBinder.Eval(Container.DataItem,"vName")%>'>
                            
</asp:Label>
                        
</ItemTemplate>
                    
</asp:TemplateColumn>
                    
<asp:ButtonColumn Text="删除" ButtonType="PushButton" CommandName="del"></asp:ButtonColumn>
                
</Columns>
            
</asp:DataGrid>

列出了4种大家可能遇到的列:
(1)绑定列
(2)模板列中直接放静态的字符串
(3)模板列中直接放绑定的字符串
(4)模板列中通过Label放绑定的字符串

下面说明在按下了删除按钮以后的四种取值的方式:
if(e.CommandName=="del")
            
{
                Response.Write(DataGrid1.Columns[
0].HeaderText+":"+e.Item.Cells[0].Text+"<br>");
                Response.Write(DataGrid1.Columns[
1].HeaderText+":"+e.Item.Cells[1].Text.Trim()+"<br>");
                Response.Write(DataGrid1.Columns[
2].HeaderText+":"+((DataBoundLiteralControl)e.Item.Cells[2].Controls[0]).Text.Trim()+"<br>");
                Response.Write(DataGrid1.Columns[
3].HeaderText+":"+((Label)e.Item.Cells[3].FindControl("name")).Text+"<br>");                
            }

(1)第一种用绑定列的方式可以直接通过Cells[i].Text取
(2)第二种方式也直接可以取,但是讨厌的vs.net总是会在前台把列中的内容换行,所以这里还需要对输出的东西进行去除首尾的空格
(3)第三种方式是网友问的最多的,不能直接通过Cells[i].Text取到值,可以通过上面给出的方法来取,同样需要去除首尾的空格
(4)第四种方式也是最简单的方式,当然你可以直接写e.Item.FindControl("name")

 

注意:如果第四种情况改为

         <asp:Label ID="name" Runat="server" ><%#DataBinder.Eval(Container.DataItem,"vName")%>
         </asp:Label>

这种写法通过分析HTML源码发现此Label只是个摆设,没有内容。其后又一个
DataBoundLiteralControl控件存放了绑定值vName的内容。因此通过label取值当然取不到。必须按第三种写法才可以取到值。

在PrimeFaces中,`LazyDataModel` 是用于支持懒加载数据的抽象类,通常与 `DataTable` 或 `DataGrid` 等组件结合使用,以实现分页、排序和过滤等操作。虽然 `LazyDataModel` 本身并不直接提供“键-”存储机制,但可以通过自定义方式为每条数据定义一个唯一标识符(即键),并在需要时根据该键检索数据。 ### 定义键 在实现 `LazyDataModel` 的子类时,通常会从数据库或服务层获数据,并将其封装为 `List<T>` 形式。为了定义键,可以在数据模型对象中引入一个唯一标识字段(如 `id`)。例如,在实体类中可以这样定义: ```java public class Product { private Long id; private String name; // 其他字段及getter/setter } ``` 当构建 `LazyDataModel` 子类实例时,确保每个对象都包含这个唯一标识字段[^1]。 ### 实现LazyDataModel并绑定键 创建一个继承 `LazyDataModel<Product>` 的类,并重写其 `load` 方法以支持懒加载。在这个过程中,可以将每条记录的 `id` 设置为其唯一键: ```java public class LazyProductDataModel extends LazyDataModel<Product> { private ProductService productService; public LazyProductDataModel(ProductService productService) { this.productService = productService; } @Override public Product getRowData(String rowKey) { if (rowKey == null || rowKey.isEmpty()) { return null; } return productService.findById(Long.valueOf(rowKey)); } @Override public Object getRowKey(Product product) { return product.getId(); } @Override public List<Product> load(int first, int pageSize, String sortField, SortOrder sortOrder, Map<String, Object> filters) { List<Product> data = productService.findProducts(first, pageSize, sortField, sortOrder, filters); this.setRowCount(productService.countProducts(filters)); return data; } } ``` 在上述代码中,`getRowKey` 方法返回数据对象的唯一标识(如 `id`),而 `getRowData` 方法则根据传入的键(通常是字符串形式的 `id`)来检索对应的数据对象[^1]。 ### 在页面中使用 在 XHTML 页面中,将 `DataTable` 绑定到自定义的 `LazyDataModel` 实例,并确保启用行键功能: ```xhtml <p:dataTable var="product" value="#{productView.lazyModel}" paginator="true" rows="10" rowKey="#{product.id}"> <!-- 列定义 --> </p:dataTable> ``` 通过 `rowKey="#{product.id}"`,PrimeFaces 能够识别每行的唯一标识,并在后续操作(如选择、编辑、删除)中使用该键进行数据定位[^1]。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值