ASP.NET Загрузка динамических элементов управления на основе значения в ViewState - PullRequest
0 голосов
/ 05 сентября 2018

Я искал решение этой проблемы, но не нашел.

Вот проблема, У меня есть статическая таблица, которая содержит список поверх других списков:

<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 или другим способом?

Спасибо

1 Ответ

0 голосов
/ 05 сентября 2018

Вы почти у цели. Решение не состоит в том, чтобы использовать ViewState. Это связано с тем, что (как вы определили) значения ViewState недоступны в PageInit, но вам нужно значение, которое является проблемой, с которой вы столкнулись.

Вместо этого используйте скрытое значение - подойдет элемент управления HiddenField. Конечно, во время управления PageInit их значения также не будут загружены. Поэтому, чтобы получить значение, используйте Page.Request.Params [MyHiddenField.UniqueID]

...