简单的问题,虽然可能是一个更好的标题,但是我不知道我在做ViewStates
时做了什么,请帮助我"。我希望能够做的是单击btnAddSkills
并在预先存在的表的底部显示一个新行(如果它不存在,则创建表)。目前,单击btnAddSkills
时会添加第一行,但是当第二行单击时,它会覆盖第一行(以及其中一个DropBox
的选定值。细胞丢失了。
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebApplication3
{
public partial class _Default : System.Web.UI.Page
{
private Table tblSkillsMaster;
protected void Page_Load(object sender, EventArgs e)
{
//my past experience tells me something will need to go in here
}
protected void btnAddSkill_Click(object sender, EventArgs e)
{
if (ViewState["masterSkills"] != null)
{
tblSkillsMaster = (Table)ViewState["masterSkills"];
}
else
{
plhSkillsTable.Controls.Clear(); //plh is a PlaceHolder
tblSkillsMaster = new Table();
plhSkillsTable.Controls.Add(tblSkillsMaster);
}
tblSkillsMaster.Rows.Add(AddRow()); //handled elsewhere, cut for brevity
ViewState["masterSkills"] = (Table)tblSkillsMaster;
}
}
}
答案 0 :(得分:2)
来自MSDN: 您可以在视图状态中存储的数据类型 您可以在视图状态中存储以下类型的对象:
否则,您可以使用Serializable属性创建自己的类并使其可序列化。
对于您的情况,您不能编辑Table类以添加属性,因为您不拥有该属性。你可以做的是创建自己的类,它将使用你想要的表中的信息,并在你的类之间来回处理,可以在viewstate中使用Table类。
答案 1 :(得分:1)
我在您发布的代码中看到的唯一一件事就是您不需要将表格转换为ViewState。
尝试更改此内容:
ViewState["masterSkills"] = (Table)tblSkillsMaster;
对此:
ViewState["masterSkills"] = tblSkillsMaster;
从ViewState检索时必须进行强制转换。
答案 2 :(得分:1)
您可以尝试这样的测试 -
protected void btnAddSkill_Click(object sender, EventArgs e)
{
if (ViewState["masterSkills"] != null)
{
tblSkillsMaster = (Table) ViewState["masterSkills"];
}
else
{
plhSkillsTable.Controls.Clear(); //plh is a Placeholder
tblSkillsMaster = new Table();
plhSkillsTable.Controls.Add(tblSkillsMaster);
}
var row = new TableRow();
for (int cellNum = 0; cellNum < 3; cellNum++)
{
var cell = new TableCell {Text = cellNum.ToString()};
row.Cells.Add(cell);
}
tblSkillsMaster.Rows.Add(row);
// *** System.Web.UI.WebControls.Table is not serializable ***
// ViewState["masterSkills"] = tblSkillsMaster;
}
但是,您无法将 System.Web.UI.WebControls.Table 添加到 ViewState ,因为它不是可序列化。
您可能希望使用类而不是表。
答案 3 :(得分:1)
ViewState只能保存可序列化的对象,在这种情况下,System.Web.UI.WebControl.Table不可用于服务,因此您无法将其存储在视图状态中。相反,您可以使用DataTable和GridView来实现您的目标。