C# Gridview在viewstate中插入和删除自定义对象

C# Gridview在viewstate中插入和删除自定义对象,c#,asp.net,gridview,C#,Asp.net,Gridview,我想设计一个嵌套的gridview,通过viewstate中的自定义业务对象动态插入、更新、删除功能 (Master Gridview) EmployeeID EmployeeName 1 Ted (Child Gridview) ItemID ItemName 1 Keyboard 2

我想设计一个嵌套的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
我以前在datatable/dataviews上做过这项工作,但它们确实占用了大量内存

  • 如何使用业务对象实现主/详细功能

  • 主详细信息/业务对象中的Dataview的替代方案是什么


  • 我知道这是一个相当宽泛的问题,但值得开始做一些事情=)

    对这个问题不是100%确定,但您要问的第一件事似乎是如何在业务对象中定义主/细节关系。在您的有子女的员工示例中,您可以有如下对象:

          public class Employee
        {
                  public int EmployeeId {get;set;}
                  public string EmployeeName {get;set;}
                  public List<Child> Children {get;set;}
        }
    
    公共类员工
    {
    public int EmployeeId{get;set;}
    公共字符串EmployeeName{get;set;}
    公共列表子项{get;set;}
    }
    
    然后,在每个级别绑定到主网格视图时,您只需绑定到所需的集合。因此,级别1将绑定到
    列表
    ,然后级别2将绑定到Employee.Children,这将是一个
    列表
    。您很可能希望在主栅格视图的RowDataBound事件期间绑定级别2


    对于像业务对象这样的复杂对象,dataview的替代方案实际上是您所做的任何事情。如果您只想在viewstate中管理插入、更新和删除,那么您可能还想拥有自己的自定义方法,因为开箱即用的数据源可能无法按您希望的方式工作。

    ,与其他与表相关的ASP.NET控件相比,GridView不会为您提供巨大的性能提升。如果按如下方式编写层次对象:

    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.
    }
    
    公共类员工
    {
    [施工人员到这里]
    public int EmployeeID{get;private set;}
    公共字符串EmployeeName{get;private set;}
    公共列表子项{get;private set;}//或集合、数组等。
    }
    
    您仍然需要侦听
    RowDataBound
    事件,将行的
    DataItem
    强制转换到子类,然后通过编程将其属性指定给GridViewRow

    除此之外,您还可以创建一个
    TemplateField
    ,在其中关闭当前的
    标记(或者
    标记,如果您感觉稍微不那么受虐),然后在您的
    GridView
    已经生成的表中嵌入另一个GridView

    请注意,我们还没有达到插入、删除和更新的程度

    老实说,如果你有时间,试着使用AJAX(真正的东西,而不是
    AutoPostBack
    junk)。ASP.NET WebMethods可以通过调用
    .RenderControl()
    从ASP.NET控件返回HTML,除非您确实需要一次性加载整个网格及其所有子网格并将其全部显示给用户,否则很可能缩短页面加载时间,并减少Web服务器上的负载

    如果将其与jQuery结合使用,调用ASP.NET WebMethods就很容易了。作为一个双管齐下的人,我认为jQuery/AJAX方法实际上比编写一些令人兴奋的LINQ语句(或ADO.NET查询)、构建一个巨大的业务对象并试图在一个页面加载中管理所有内容更容易

    另一方面,如果您确定要使用ASP.NET来完成此任务,我强烈建议您通读有关此活动的MSDN文章。它详细介绍了正确设置和获取EditIndex的一些细节,并将其事件分解为一些小函数,这对于这样的事情来说是绝对必要的。除了您在那里看到的内容之外,我建议您在会话中存储业务对象集合,并在任何行编辑/创建/删除事件中修改它们,然后重新绑定GridView


    使用此方法,您的用户在理想情况下必须单击“提交”按钮才能实际保存任何更改。这可以让你(和他们)避免在有人意外删除某个项目或用无效值更新该项目时产生很多心痛。

    这是一个多么美妙和详细的响应啊。谢谢yoyu jwiscarson。我以前确实用ADO.NET实现了表,但是维护起来真的很困难。我使用了datatable、Viewstate和update面板。但主要问题是性能。现在,我正在研究JQuery/Session,业务对象来替换datatable/Viewstate组合。一个小问题是,viewtstate是否比会话更容易维护?使用会话时,我是否必须清除页面出口上的会话,甚至检查用户是否关闭了浏览器?使用viewstate很容易,但是我的页面大小增加了很多。如果您将会话到期时间设置为20分钟左右,您就不必太担心了。但是,作为额外的预防措施,我确实使用母版页并检查用户在页面加载时是否经过身份验证。不过,我的应用程序也使用多个角色。谢谢bwmfsu。我认为对象数据源可以工作,但我仍然必须尝试。您会推荐会话而不是Viewstate吗?管理会话是否比viewstate更困难?会话和viewstate是两种完全不同的存储模式。Viewstate仅适用于回发,会话应用于整个用户会话。通常,特定于页面的内容不会存储在会话中。诸如有关用户的信息、可应用于特定浏览会话的内容等应该存储在会话中。所以,这并不是说管理一个比管理另一个更难。两者都是序列化对象的键值对,但存在于不同的状态包中。