Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.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/9/spring-boot/5.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# ASP.NET会话状态&;回发问题_C#_Asp.net - Fatal编程技术网

C# ASP.NET会话状态&;回发问题

C# ASP.NET会话状态&;回发问题,c#,asp.net,C#,Asp.net,我有一个我认为是会话状态问题的问题,但我不知道到底出了什么问题。我有一个示例项目来说明这个问题。(下面的代码)我有两个按钮。每个应用程序使用一些唯一的数据填充一个列表,然后使用该数据向表中添加一行。该行包含文本框,以便用户可以编辑数据。(对于我的示例,没有保存数据的更新按钮。)要在VS2010中重现该问题,请创建一个新的“ASP.NET Web应用程序”项目,并将aspx代码和c#代码复制/粘贴到Default.aspx中,然后运行该应用程序 按DataSet 1按钮,网格应填充1行 编辑其中

我有一个我认为是会话状态问题的问题,但我不知道到底出了什么问题。我有一个示例项目来说明这个问题。(下面的代码)我有两个按钮。每个应用程序使用一些唯一的数据填充一个列表,然后使用该数据向表中添加一行。该行包含文本框,以便用户可以编辑数据。(对于我的示例,没有保存数据的更新按钮。)要在VS2010中重现该问题,请创建一个新的“ASP.NET Web应用程序”项目,并将aspx代码和c#代码复制/粘贴到Default.aspx中,然后运行该应用程序

  • 按DataSet 1按钮,网格应填充1行
  • 编辑其中一个文本框中的数据,并在文本框中关闭选项卡。(新输入的文本应该是remian,字体应该是蓝色。这就是我想要的。)
  • 现在,单击任一数据集按钮重置列表并刷新表。 编辑其中一个文本框中的数据,并在文本框外设置选项卡。(框中的文本会立即刷新回其原始值。但这只会发生一次。如果现在编辑任一文本框,它将正常工作。)
  • 这是可以重复的。。。按下数据集按钮a第二、第三等时间后的第一次编辑将重置回原始值。我不知道为什么


欢迎使用ASP.NET!

使用数据集#1填充表格:

使用数据集#2填充表格:


使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Web;
使用System.Web.UI;
使用System.Web.UI.WebControl;
命名空间调试回发问题
{
公共部分类\u默认值:System.Web.UI.Page
{
私有列表_MyData=新列表();
受保护的无效页面加载(对象发送方、事件参数e)
{
}
受保护的无效页_Init(对象发送方,事件参数e)
{
LoadSessionData();
GenerateGrid(false);
}
受保护的无效btnDS1\u单击(对象发送方,事件参数e)
{
_MyData=新列表();
_MyData.Add(“111”);
_MyData.Add(“aaa”);
SaveSessionData();
GenerateGrid(true);
}
受保护的无效btnDS2\u单击(对象发送方,事件参数e)
{
_MyData=新列表();
_MyData.Add(“222”);
_MyData.Add(“bbb”);
SaveSessionData();
GenerateGrid(true);
}
私有void SaveSessionData()
{
会话[“MyData”]=\u MyData;
}
私有void LoadSessionData()
{
if(会话[“MyData”]!=null)
_MyData=(列表)会话[“MyData”];
其他的
_MyData=新列表();
}
私有void生成器ID(布尔ClearData)
{
if(ClearData)
而(tblData.Rows.Count>1)
tblData.Rows.Remove(tblData.Rows[tblData.Rows.Count-1]);
TableRow tr=新的TableRow();
foreach(MyData中的字符串s)
{
TableCell tc=新的TableCell();
TextBox txtBox=新建TextBox();
Text=s;
Add(“OriginalValue”,s);
txtBox.TextChanged+=新事件处理程序(txtBox\u TextChanged);
txtBox.AutoPostBack=true;
tc.Controls.Add(txtBox);
tr.Cells.Add(tc);
}
如果(tr.Cells.Count>0)
tblData.Rows.Add(tr);
}
void txtBox_TextChanged(对象发送方,事件参数e)
{
TextBox Sender=(TextBox)Sender;
if(Sender.Text==Sender.Attributes[“OriginalValue”])
Sender.ForeColor=System.Drawing.Color.Black;
其他的
Sender.ForeColor=System.Drawing.Color.Blue;
}
}
}

尝试创建数据表。在“事件”中,我会将asp表内容复制到datatable,然后在获得服务器响应时将其添加到datatable。然后将数据表复制回asp表,然后重复。。。数据表可以像变量一样使用


或者尝试使用cookie。

嗨,我从工作中抽出一些时间来编译您的代码,我想出来了,只需将您的文本框更改为以下内容:

 void txtBox_TextChanged(object sender, EventArgs e)
        {
            TextBox Sender = (TextBox)sender;
            if (Sender.Text == Sender.Attributes["OriginalValue"])
                Sender.ForeColor = System.Drawing.Color.Black;
            else
            {
                Sender.ForeColor = System.Drawing.Color.Blue;
                if (Session["MyData"] != null)
                {
                    List<string> _ss = (List<string>)Session["MyData"];
                    //_ss.Find(a => a == Sender.Attributes["OriginalValue"]);
                    _ss.Remove(Sender.Attributes["OriginalValue"]);
                    _ss.Add(Sender.Text);
                }
            }
        }
void txtBox\u text已更改(对象发送方,事件参数e)
{
TextBox Sender=(TextBox)Sender;
if(Sender.Text==Sender.Attributes[“OriginalValue”])
Sender.ForeColor=System.Drawing.Color.Black;
其他的
{
Sender.ForeColor=System.Drawing.Color.Blue;
if(会话[“MyData”]!=null)
{
列表_ss=(列表)会话[“MyData”];
//_ss.Find(a=>a==Sender.Attributes[“OriginalValue]”);
_ss.Remove(Sender.Attributes[“OriginalValue”]);
_ss.Add(Sender.Text);
}
}
}
不客气

尝试更改

 protected void Page_Init(object sender, EventArgs e)
        {
            LoadSessionData();
            GenerateGrid(false);
        }


根据您的描述,我相信您的值正在被重置,因为ASP.NET中的页面生命周期是如何工作的&也就是说,由于ASP.NET的怪癖,在您的事件之前调用了页面初始化。上面的代码就是我如何处理它的,我相信还有其他的方法。

好的,我现在就让它工作了。Wizpert的回答为我指明了正确的方向。。。当发现TextChanged事件在值被错误地重置为原始值时没有触发时,我突然想到在单击事件期间我调用了GenerateGrid(true)。这迫使删除现有行并添加新行。(删除和添加
 void txtBox_TextChanged(object sender, EventArgs e)
        {
            TextBox Sender = (TextBox)sender;
            if (Sender.Text == Sender.Attributes["OriginalValue"])
                Sender.ForeColor = System.Drawing.Color.Black;
            else
            {
                Sender.ForeColor = System.Drawing.Color.Blue;
                if (Session["MyData"] != null)
                {
                    List<string> _ss = (List<string>)Session["MyData"];
                    //_ss.Find(a => a == Sender.Attributes["OriginalValue"]);
                    _ss.Remove(Sender.Attributes["OriginalValue"]);
                    _ss.Add(Sender.Text);
                }
            }
        }
 protected void Page_Init(object sender, EventArgs e)
        {
            LoadSessionData();
            GenerateGrid(false);
        }
protected override void OnLoadComplete(EventArgs e)
{
     LoadSessionData();
     GenerateGrid(false);
 }