0

我有一个带有两个数据网格的页面。一个从数据库中读取值并允许选择。当用户选择一个网格时,它会将数据添加到第二个数据网格。这是我为此使用的代码:

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    Dim dc1 As New DataColumn("NAME")
    Dim dc2 As New DataColumn("PRICE")
    dt.Columns.Add(dc1)
    dt.Columns.Add(dc2)
    Dim dr1 As DataRow = dt.NewRow()
    GridView2.DataSource = dt
    GridView2.DataBind()
End Sub

Protected Sub GridView1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles GridView1.SelectedIndexChanged
        Dim dr1 As DataRow = dt.NewRow()

        dr1(0) = Name.ToString
        dr1(1) = Price.ToString
        dt.Rows.Add(dr1)
        GridView2.DataSource = dt
        GridView2.DataBind()

现在,这工作得很好......但这显然可以在表单服务下工作。在基于 Web 的环境中,每当用户在网格 1 中选择一个值时,它都会重置网格 2 中的值,并且每次用户选择一个值时,我都需要将多行添加到第二个 Datagrid 中。当 GridView1 中发生 selectedindexchanged 事件时,会触发“数据添加”。我想我需要将数据保存到会话/cookie,但我不知道在数据网格的情况下我将如何做到这一点。比如,我应该保存什么以及如何阅读它。两个 Gridview 都在更新面板控件下,因此回发应该是即时的(如果需要)。

明显更新的代码...

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not IsPostBack Then
        dt = DirectCast(Session("Purchase"), DataTable)
    Else
        Dim dc1 As New DataColumn("NAME")
        Dim dc2 As New DataColumn("PRICE")
        dt.Columns.Add(dc1)
        dt.Columns.Add(dc2)
        Dim dr1 As DataRow = dt.NewRow()
        GridView2.DataSource = dt
        GridView2.DataBind()
    End If
End Sub

            Dim dr1 As DataRow = dt.NewRow()
        Session.Add("Purchase", dt)
        dr1(0) = Name.ToString
        dr1(1) = Price.ToString
        dt.Rows.Add(dr1)
        dt = DirectCast(Session("Purchase"), DataTable)
        GridView2.DataSource = dt
        GridView2.DataBind()
4

2 回答 2

1

尝试这个:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    'This will load the DT into the session when the page initially loads and then skip it on subsequent page loads.
    If Not IsPostBack Then
        Dim dc1 As New DataColumn("NAME")
        Dim dc2 As New DataColumn("PRICE")
        dt.Columns.Add(dc1)
        dt.Columns.Add(dc2)
        Session.Add("Purchase", dt)
        GridView2.DataSource = dt
        GridView2.DataBind()
    End If
End Sub

GridView1_SelectedIndexChanged:

'Clear out the old datasource.
GridView2.Datasource = Nothing
GridView2.DataBind()
'Pull the datatable from the session variable
dt = DirectCast(Session("Purchase"), DataTable)
'Create the new row and set the values
Dim dr1 As DataRow = dt.NewRow()
dr1(0) = Name.ToString
dr1(1) = Price.ToString
'Add the row to the table
dt.Rows.Add(dr1)
'If the session variable exists(which is should) then we overwrite it, if not we create it.
If Session("Purchase") Is Nothing Then Session.Add("Purchase", dt) Else Session("Purchase") = dt
'Reset the datasource of the datagrid
GridView2.DataSource = dt
GridView2.DataBind()

我之前遇到过的一件事是,为了datasource按预期实际更新我需要做的事情,GridView2.Datasource = Nothing并且GridView2.DataBind()作为事件处理程序中的第一件事,我不知道为什么,但是当我这样做时它会起作用并且当我不这样做时它不会,所以我没有花时间研究它。

于 2013-05-14T20:18:13.313 回答
0

在我看来,问题在于当您选择第一个值时,它会创建一个回发并重置另一个网格,您可以在原始元素上禁用 EnableAutoPostback,但我想知道您如何操作所选数据。

我认为您可以轻松地完成此操作,而不是使用 2 个网格,而是使用一个,将带有复选框的列添加到名为“selected”的网格,然后保存选定的行 ID。您是将选定的行保存到数据库还是将如何操作选定的行?另一种可能性是使用 JQuery 拖放(在我看来这将是最优雅的解决方案,但需要更多时间进行编码),您可以将行从一个网格拖到另一个网格,然后保存选定的行。

于 2013-05-14T18:49:07.187 回答