Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从datatable中删除的行也将从创建datatable的会话变量中删除_C#_Asp.net_Session_Datatable - Fatal编程技术网

C# 从datatable中删除的行也将从创建datatable的会话变量中删除

C# 从datatable中删除的行也将从创建datatable的会话变量中删除,c#,asp.net,session,datatable,C#,Asp.net,Session,Datatable,在处理存储在会话变量中的数据表时,我注意到一些奇怪的行为。从从会话变量创建的数据表中删除一行似乎也会修改会话变量,如下所示 <asp:GridView ID="gvResults" runat="server" DataKeyNames="id"> <Columns> <asp:TemplateField ShowHeader="False"> <ItemTemplate> <asp:Butto

在处理存储在会话变量中的数据表时,我注意到一些奇怪的行为。从从会话变量创建的数据表中删除一行似乎也会修改会话变量,如下所示

<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.
    }
}

使用制度;
使用System.Collections.Generic;
使用System.Linq;
使用System.Web;
使用System.Web.UI;
使用System.Web.UI.WebControl;
使用系统数据;
公共部分类测试:System.Web.UI.Page
{
受保护的无效页面加载(对象发送方、事件参数e)
{
如果(!IsPostBack)
{
DataTable dtResults=新DataTable();
dtResults.Columns.Add(“id”);
dtResults.Rows.Add();
dtResults.Rows[0][“id”]=“1”;
dtResults.Rows.Add();
dtResults.Rows[1][“id”]=“2”;
会话[“id”]=dtResults;
gvResults.DataSource=dtResults;
gvResults.DataBind();
}
}
受保护的void命令(对象发送器,CommandEventArgs e)
{
如果(例如,CommandName==“删除”)
{
DataTable dtTemp=(DataTable)会话[“id”];
对于(Int32 i=0;i
我没有将修改后的
dtTemp
datatable保存回
Session[“id”]
变量。我的理解是,
dtTemp
中应该有一行,因为调用
DisplayData
时,删除了一行,
Session[“id”]
中应该有两行。但是,运行
DisplayData
后,gridview中只显示一行


我希望有人能解释为什么会发生这种情况

这是因为
dtTemp
和会话变量都是指向同一对象的对象引用。

此行:

DataTable dtTemp = (DataTable)Session["id"];
不会做你认为它会做的事。由于
DataTable
是一种引用类型,因此您只需获取指向该对象在内存中位置的指针(恰好位于SessionState变量中),而不是创建它的新副本


如果您想在会话中不修改数据表的情况下操作
数据表
,则需要查看克隆模式,如

谢谢。你的回答和mkocubinski的帮助。我创建了一个新的数据表,从
dtTemp
克隆了列,然后使用ImportRow函数只复制我需要的数据。