Использование пользовательского элемента управления в качестве строки внутри заполнителя

У меня есть заполнитель asp на моей странице, и я динамически вставляю в него "строки", где каждая строка является пользовательским элементом управления.

Если запрос является запросом GET, я загружаю данные из базы данных и заполняю столько пользовательских элементов управления, сколько необходимо. Я также добавляю экземпляры управления в содержимое сеанса.

Если запрос является запросом POST, я сначала заново создаю элементы управления, просматривая содержимое сеанса внутри Page_Load(). После этого обработчик каждой кнопки может выполнять любую дополнительную работу, которую он должен выполнить, например добавить новую строку (в заполнитель, сеанс и БД), удалить строку (из заполнителя, сеанса и БД) или обновить существующий ряд.

Я сталкиваюсь с несколькими проблемами здесь:

  1. При удалении строк иногда неправильные данные отображаются на экране после удаления, даже если правая строка была удалена. Это опасно, потому что для дальнейшего удаления мы не знаем, какие строки будут затронуты.
  2. При добавлении новой строки иногда одна из существующих строк будет содержать неверные данные (в частности, данные из другой существующей строки)

Как я могу исправить эти проблемы? Мне трудно даже диагностировать проблему. Это общие проблемы? Я просто делаю это совершенно неправильно? Каковы лучшие способы сделать это?

1 ответ

Решение

У меня были такие проблемы раньше. Я исправил их:

  • Когда вы создаете свой пользовательский контроль перед тем, как поместить его в заполнитель, он должен иметь тот же идентификатор, что и до обратной передачи (т. Е. При первом создании). Я делаю что-то вроде "usr_" + <db record id>, Это обеспечивает одинаковый идентификатор независимо от того, в каком порядке он загружается, какие записи удаляются и т. Д. Это, вероятно, самое важное, потому что, если вы не назначите его, идентификаторы.NET назначат их для вас - и они назначаются в том порядке, в котором они отображаются в коллекции элементов управления, что означает, что у вас может быть неверная информация в неправильном пользовательском элементе управления (который вы описали в своем вопросе).
  • Не использовать сеанс для хранения информации о странице. Как только проблемы с идентификацией были устранены, у людей все еще были проблемы, если открылись две вкладки на одной странице.

Что-то вроде этого:

using (SqlConnection c = new SqlConnection(DB_STRING))
{
    c.Open();
    String sql = @"
        SELECT *
        FROM yourTable
        ORDER BY ID;";
    using (SqlCommand cmd = new SqlCommand(sql, c))
    {
        using (SqlDataReader d = cmd.ExecuteReader())
        {
            while (d.Read())
            {
                UserControl uc = (UserControl)new UserControl().LoadControl("~/path/to-your-control/YourControl.ascx");
                uc.ID = "usr_" + d["ID"];
                plcHolderRows.Controls.Add(uc);
            }
        }
    }
}
Другие вопросы по тегам