Aus einer Datentabelle entfernte Zeilen werden auch aus der Sitzungsvariablen entfernt, die die Datentabelle erstellt hat

Beim Arbeiten mit Datentabellen, die in Sitzungsvariablen gespeichert sind, ist ein merkwürdiges Verhalten festzustellen. Das Entfernen einer Zeile aus einer Datentabelle, die aus einer Sitzungsvariablen erstellt wurde, scheint auch die Sitzungsvariable zu ändern, wie unten gezeigt.

<asp:GridView ID="gvResults" runat="server" DataKeyNames="id">
<Columns>
    <asp:TemplateField ShowHeader="False">
        <ItemTemplate>
            <asp:Button ID="btnSelectUserToRemove" runat="server" CausesValidation="false" CommandName="Remove" Text="Select" CommandArgument='<%# Eval("id") %>' OnCommand="Command" />
        </ItemTemplate>
    </asp:TemplateField>
</Columns>
</asp:GridView>


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;

public partial class Test : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            DataTable dtResults = new DataTable();
            dtResults.Columns.Add("id");

            dtResults.Rows.Add();
            dtResults.Rows[0]["id"] = "1";
            dtResults.Rows.Add();
            dtResults.Rows[1]["id"] = "2";

            Session["id"] = dtResults;
            gvResults.DataSource = dtResults;
            gvResults.DataBind();
        }
    }

    protected void Command(object sender, CommandEventArgs e)
    {
        if (e.CommandName == "Remove")
        {
            DataTable dtTemp = (DataTable)Session["id"];
            for (Int32 i = 0; i < dtTemp.Rows.Count; i++)
            {
                if (e.CommandArgument.ToString() == dtTemp.Rows[i]["id"].ToString())
                {
                    dtTemp.Rows[i].Delete(); //Should just remove the row from the datatable.
                }
            }
            dtTemp.AcceptChanges();
        }
        DisplayData();
    }

    protected void DisplayData()
    {
        gvResults.DataSource = (DataTable)Session["id"];
        gvResults.DataBind(); //Should display both rows because I did not save the modified datatable back to this session variable.
    }
}

Ich speichere die geänderten nichtdtTemp datierbar zurück zumSession["id"] Variable. Meines Erachtens sollte eine Zeile enthalten seindtTemp, weil eine Zeile gelöscht wurde und 2 Zeilen inSession["id"] beim anrufenDisplayData. In der Rasteransicht wird danach jedoch nur eine Zeile angezeigtDisplayData läuft.

Ich hoffe, es gibt jemanden da draußen, der etwas Licht ins Dunkel bringen kann, warum dies geschieht.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage