c# - ASP.NET 根据 ViewState 中的值加载动态控件
问题描述
我一直在寻找解决这个问题的方法,但我还没有找到。
这是问题所在,我有一个静态创建的表,其中包含一个列表而不是其他列表:
<table class="styled-list">
<tbody>
<tr>
<td><a>Lista 1</a></td>
<td>
<asp:Button runat="server" ID="btnDelete1" />
<asp:Button runat="server" ID="btnEdit1" />
</td>
</tr>
<tr>
<td><a>Lista 2</a></td>
<td>
<asp:Button runat="server" ID="btnDelete2" />
<asp:Button runat="server" ID="btnEdit2" />
</td>
</tr>
</tbody>
</table>
当单击这些列表中的任何一个的编辑按钮时,应显示另一个列表。要知道哪些列表已被选中,我将列表名称保存在ViewState
.
private string ListNameOfSelected
{
get
{
if (ViewState["ListNameOfSelected"] != null) return (string)ViewState["ListNameOfSelected"];
else return "";
}
set { ViewState["ListNameOfSelected"] = value; }
}
protected void btnEdit_Click(object sender, EventArgs e, string name)
{
ListNameOfSelected = name;
RenderPersonsInList();
}
该RenderPersonsInList()
函数将创建一个包含所选列表中的人员的列表。
private void RenderPersonsInList()
{
txtNameInTitle.InnerText = ListNameOfSelected;
TableRow tr;
TableCell nameCell, emailCell, deleteCell;
ImageButton deleteButton;
Guid[] ids = new Guid[] { };
string[] names = new string[] { };
string[] emails = new string[] { };
switch (ListNameOfSelected)
{
case "Lista 1":
ids = new Guid[] { Guid.NewGuid(), Guid.NewGuid() };
names = new string[] { "Anonymous1", "Anonymous2" };
emails = new string[] { "Anonymous1@hotmail.com", "Anonymous2@gmail.com" };
break;
case "Lista 2":
ids = new Guid[] { Guid.NewGuid() };
names = new string[] { "Anonymous3" };
emails = new string[] { "Anonymous3@hotmail.com" };
break;
default:
break;
}
for (int i = 0; i < names.Length; i++)
{
Guid personID = ids[i];
tr = new TableRow
{
ID = "row-" + personID.ToString()
};
nameCell = new TableCell
{
Text = names[i]
};
emailCell = new TableCell
{
Text = emails[i]
};
deleteCell = new TableCell();
deleteButton = new Button
{
ID = personID.ToString()
};
deleteButton.Click += (sender, EventArgs) => { DeleteButton_Click(sender, EventArgs, names[i], personID); };
deleteCell.Controls.Add(deleteButton);
tr.Controls.Add(nameCell);
tr.Controls.Add(emailCell);
tr.Controls.Add(deleteCell);
tbListMembers.Controls.Add(tr);
}
pnlViewList.Visible = true;
}
现在的问题是当用户deleteButton
在动态创建的列表中点击时,有一个PostBack,需要重新创建列表。但是为了让点击监听器工作,必须在Page_Init
orPage_PreInit
函数中创建列表,而这里ViewState
还没有启动。
无论如何要知道用户在创建动态列表时选择了哪个列表,无论是使用ViewState
还是其他方式?
谢谢
解决方案
你快到了。解决方案是不使用 ViewState。这是因为(如您所确定的)ViewState 值在 PageInit 中不可用,但您需要遇到问题的值。
而是使用隐藏值 - HiddenField 控件即可。当然,在 PageInit 控件期间也不会加载它们的值。所以要使用 Page.Request.Params[MyHiddenField.UniqueID] 来获取值
推荐阅读
- scala - 方法作为参数,枚举值要使其类型化
- python - 如何用python在windows中打开文件?
- mysql - 在mysql存储过程中获取持续时间并在表中更新
- javascript - 我总是想知道类似 [, thisArg] 的东西的含义
- excel - Excel - 根据动态条件填充单元格
- c++ - c ++使用getline和FILE而不是ifstream读取文件
- vb.net - request.getResponse() 没有从 URL 返回实际源
- odoo - 从合作伙伴的购买中调用 onchange
- javascript - 将两个或多个具有相似值的数组一起添加到一个数组中
- python - 如何在 django 模板中传递产品下载链接