我想设计一个嵌套的gridview,在viewstate中通过自定义业务对象动态插入,更新,删除功能。
(Master Gridview)
EmployeeID EmployeeName
1 Ted
(Child Gridview)
ItemID ItemName
1 Keyboard
2 Mouse
2 John
(Child Gridview)
ItemID ItemName
1 PSU
2 GPU
3 Printer
我过去曾使用数据表/数据视图完成此操作,但它们是真正的内存耗尽。
如何使用业务对象实现主/明细功能?
主要详细信息/业务对象中Dataview的替代方法是什么。
我知道它是一个相当广泛的问题,但值得开始的东西=)
答案 0 :(得分:3)
老实说,与其他与表相关的ASP.NET控件相比,GridViews不会为您提供巨大的性能提升。如果您按如下方式编写分层对象:
public class Employee
{
[Constructors go here]
public int EmployeeID { get; private set; }
public string EmployeeName { get; private set; }
public List<Child> Children { get; private set; } // Or Collection, Array, etc.
}
您仍然需要监听RowDataBound
事件,将行DataItem
强制转换为子类,然后以编程方式将其属性分配给GridViewRow。
最重要的是,您可以创建一个TemplateField
来关闭当前的<td>
和<tr>
代码(或<div>
或{ {1}}标记,如果你的感觉略微不那么自虐),然后在<span>
已生成的表格中嵌入另一个GridView。
请注意,我们尚未达到您插入,删除和更新的程度。
老实说,如果你有时间,尝试使用AJAX(真正的东西,而不是GridView
垃圾)。 ASP.NET WebMethods可以通过调用AutoPostBack
从ASP.NET控件返回HTML,除非您绝对需要一次性加载整个网格及其所有子项并将其全部显示给您的用户,否则它将会更有可能缩短页面加载时间,减少网络服务器的负担。
如果将此与jQuery结合使用,则调用ASP.NET WebMethods很容易。作为一个完成这两个方面的人,我认为jQuery / AJAX方法实际上比编写一些语音LINQ语句(或ADO.NET查询),构建一个巨大的业务对象,并试图在一个中管理所有这些更容易页面加载。
另一方面,如果您受到约束并决定使用ASP.NET,我高度建议您阅读有关RowEditing事件的MSDN文章。它详细介绍了正确设置和获取EditIndex的一些细节,并将其事件分解为微小的函数,这对于类似的东西是绝对必要的。除了你在那里看到的,我建议你在会话中存储你的业务对象集合,并在任何行edit / create / delete事件上修改它们,然后重新绑定你的GridView。
使用此方法,您的用户最好必须单击提交按钮才能实际保存所有更改。这允许您(和他们)在有人意外删除某个项目或使用无效值更新项目时避免很多心痛。
答案 1 :(得分:1)
不是100%肯定这个问题,但看起来你要问的第一件事是如何在业务对象中定义主/细节关系。在您的有孩子的员工示例中,您可以拥有一个对象:
public class Employee
{
public int EmployeeId {get;set;}
public string EmployeeName {get;set;}
public List<Child> Children {get;set;}
}
然后,当涉及到绑定到每个级别的主网格视图时,您只需绑定到所需的集合。因此,级别1将绑定到List<Employee>
,然后级别2将绑定到Employee.Children,这将是List<Child>
。您很可能希望在主网格视图的RowDataBound事件期间绑定级别2
像业务对象这样的复杂对象的数据视图的替代方案实际上就是你做的任何事情。如果您只想在viewstate中管理插入,更新,删除,那么您可能也希望拥有自己的自定义方法来执行此操作,因为开箱即用的数据源可能无法按您希望的方式工作。