我有一个包含两个数据网格的页面。一个从数据库中读取值并允许选择。当用户选择网格时,它将数据添加到第二个数据网格。这是我正在使用的代码:
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的环境中,每当用户选择Grid 1中的值时,它都会重置Grid 2中的值,并且我需要在每次用户选择值时将多行添加到第二个Datagrid。当selectedIndexchanged事件发生在GridView1中时,将触发“数据添加”。我想我需要将数据保存到会话/ cookie但我不知道如何在数据网格的情况下这样做。比如,我应该保存什么以及我如何阅读它。两个Gridview都在Update Panel控件下,因此Postback应该是瞬时的(如果需要)。
明亮更新代码......
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()
答案 0 :(得分: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()
作为第一件事。事件处理程序,我不知道为什么但是当我这样做时它不起作用但是当我不这样做时它不会这样做我没有花时间研究它。
答案 1 :(得分:0)
在我看来问题就是当你选择第一个值时,它会创建一个回发并重置另一个网格,你可以在原始元素上禁用EnableAutoPostback但我想知道你是如何操作所选数据的
我认为您可以轻松完成此操作,如果不使用2个网格而是使用一个网格,请将一个带有复选框的列添加到名为“已选择”的网格中,然后保存选定的行ID。您是否将所选行保存到数据库中,或者您将如何操作所选行?另一种可能性是使用JQuery Drag and Drop(在我看来这将是最优雅的解决方案,但需要更多时间来编写代码),你可以将行从一个网格拖到另一个网格,然后保存选定的行。