动态地将多行添加到ASP Datagrid

时间:2013-05-14 17:55:57

标签: asp.net vb.net

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

    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()

2 个答案:

答案 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 = NothingGridView2.DataBind()作为第一件事。事件处理程序,我不知道为什么但是当我这样做时它不起作用但是当我不这样做时它不会这样做我没有花时间研究它。

答案 1 :(得分:0)

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

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