【问题标题】:ASP.NET - VB.NET - Persist a GridView's dynamically chosen DataSourceID over multiple button clicksASP.NET - VB.NET - 通过多次按钮单击保持 GridView 动态选择的 DataSourceID
【发布时间】:2009-11-11 20:13:33
【问题描述】:

我有一个应用程序,我需要为 GridView 动态选择 SQLDataSource,以便我可以使用 2 个存储过程中的 1 个,具体取决于谁登录到系统。

我的问题是我使用这样的逻辑,在按钮点击...

If Session("SiteType") = "Type1" Then
     GridView1.DataSourceID = "SqlDataSource2"
Else
     GridView1.DataSourceID = "SqlDataSource1"
End If
GridView1.DataBind()

当您单击显示带有网格视图的面板的按钮时,会发生这种情况。

然后用户进行更改(基本上是在网格的一个或多个连线上调整文本框),然后单击“保存”。但是,一旦发生这种情况,gridview 就不再知道它的 DataSourceID,所以当我尝试通过 gridview 的行时 - 没有。

如果在单击保存按钮时我输入了相同的代码,它(当然)会清除我在表单中所做的任何数据更改。

那么,简单地说 - 我如何动态选择 SqlDataSource,但只有一次,以便程序保持与 gridview 关联的 SqlDataSourceID 直到循环结束?这是 ViewState 的事情吗?我不完全了解 ViewState...

请原谅我的无知 - 我假设这有点简单,但我只是没有大量的 .NET 经验。如果有更好的方法,我也有兴趣听到 - 也就是说,时间至关重要,所以我现在正在寻找快速解决方案(老板在我的脖子上呼吸......呵呵) .

谢谢!

【问题讨论】:

    标签: .net vb.net gridview viewstate sqldatasource


    【解决方案1】:

    您需要在每次回发时重新绑定网格,因为您是在运行时在代码中设置数据源。

    将此添加到页面加载事件处理程序:

    If Page.IsPostback Then
        If Session("SiteType") = "Type1" Then
           GridView1.DataSourceID = "SqlDataSource2"
        Else
           GridView1.DataSourceID = "SqlDataSource1"
        End If
        GridView1.DataBind()
    End If
    

    【讨论】:

    • 这基本上是我正在做的事情,但它不在 Page_Load 中,而是在 2 个单独的按钮单击时 - 一个用于初始加载,一个用于保存更改。但是,我第二次这样做时,在保存时,它会从数据库中重新加载,并清除我对行所做的更改,这是根本问题......我需要一种动态设置它的方法,但不是重新绑定,直到保存操作发生后。
    • (旁注:我确实在 Page_Load 中尝试过,但它失败了,因为 SqlDataSource 存储过程所需的某些数据在完成几个步骤之前尚未确定 - 所以它必须是在按钮上,而不是在 page_load 上)
    • 其实你可能需要在Page Init事件中更早的绑定。那是因为 Asp.net 在 Init 事件之后但在 Load 之前加载视图状态。因此,您需要在加载视图状态之前绑定网格数据,以便“维护”任何更改。
    • 您的 sqldatasource 数据可以保存在 Session State 或 Cookie 中,以便在 Init 事件中可用。
    【解决方案2】:

    我通过简单地将选项放入 cookie 中完成此操作,并在需要时再次从 cookie 中拉下该选项。

    Cookies、Session 和 ViewState 通常都以相同的方式工作。它们是一种在有限时间内持久保存信息的简单方法。您创建一个密钥,添加一个值,然后将密钥保存回您将要使用的任何介质,无论是 cookie、会话还是视图状态。当您再次需要该值时,您只需从持久介质中找到键,加载键/值对,然后通过通常将其放回某种类型的变量来访问该值。

    祝你好运,希望这对一些人有所帮助。

    【讨论】:

      【解决方案3】:

      我只是将其保存为会话变量。 前任。 会话(“数据源”)=我的数据源

      然后您将 GridView 的数据源设置为: MyGridView.datasource = session("数据源") MyGridView.bind()

      应该可以的。

      希望这会有所帮助' 大卫。

      【讨论】:

      • 我真的不会将会话用于这样的事情。最多,您可以将 DataSourceID 存储在其中,但肯定不能像数据源那样复杂(和有状态)对象。关于在会话中存储什么和不存储什么已经有很多讨论,但我建议对会话进行简约的使用,只有在没有更好的选择时才使用它。我见过很多情况下,会话的使用会产生代码/设计的味道,比如使用它来存储完整的数据集以在页面之间传输数据。
      猜你喜欢
      • 2014-09-12
      • 1970-01-01
      • 2015-09-05
      • 1970-01-01
      • 1970-01-01
      • 2016-07-26
      • 2014-07-02
      • 2018-11-27
      • 2011-05-03
      相关资源
      最近更新 更多