Я искал решение этой проблемы, но не нашел.
Вот проблема,
У меня есть статическая таблица, которая содержит список поверх других списков:
<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
или Page_PreInit
, а здесь ViewState
еще не инициирован.
Есть ли способ узнать, какой список выбрал пользователь при создании динамического списка, используя ViewState
или другим способом?
Спасибо