Обменяйтесь данными между usercontrols

На моей странице у меня есть n-userControls (то же управление), я должен связаться между ними (чтобы быть более конкретным, я должен передать один в значении).

Я не хочу включать страницу хостинга для этого.

Действия средств управления как "пейджеры" и взаимодействуют с разбитыми на страницы данными на странице хостинга через события, на которые подписан хостинг страницы.
Таким образом, когда пользователь нажимает на один из пейджера и изменений, это - состояние, другое управление должно знать об этом и само изменение соответственно.

Я не могу использовать VieState, потому что состояние отображения на управление и controlstate - также.

Я могу использовать Сессию для этого? (сессия совместно используется и существует только одно значение, которое я должен сохранить),

Или возможно существует что-то лучше, что я могу использовать? (никакой QueryString)

6
задан toraan 26 March 2010 в 21:16
поделиться

3 ответа

Лично не существует "простого" способа сделать это без использования управляющей страницы или события.

Судя по тому, что вы говорите, я предполагаю, что это будет примерно так. Предположим, что два элемента управления A и B являются элементами управления вашим пейджером.

Содержащая страница подписывается на событие «PageSelectionChanged» в обоих элементах управления, в ответ на это событие она обновляет данные, которые у вас уже есть, И перечисляет все элементы управления пейджером, устанавливая значение «Текущая страница».

У вас уже есть связка событий для связи из элемента управления -> страницы, используйте то, что вы уже создали.

Почему не сеанс?

В комментариях меня спросили, будет ли это лучше, чем сеанс, и ответ положительный по ряду причин.

  1. Информация о сеансе, если явная очистка не существует в течение сеанса пользователя (обычно 20 минут)
  2. Из-за номера 1 вам нужно будет добавить элементы на страницу, если (! Ispostback) для «очистить» "переменные сеанса, чтобы пользователь не запускал другую страницу.
  3. При дальнейшем росте приложения информация о сеансе должна быть перенесена из процесса в SQL Server или иным образом для работы в среде веб-фермы, для этого я также стараюсь этого избегать.
  4. Использование сеанса сохраняет эту информацию в памяти на веб-сервере, хотя и небольшого размера (4 байта, если целое число), она может складываться и не является необходимой.
  5. В зависимости от характера ваших обновлений вы не можете обеспечить порядок управления с помощью одного сеанса чтобы гарантировать, что 1 элемент управления принудительно обновляет все элементы управления.

Существуют и другие решения, решение, подобное описанному выше, которое выполняет рекурсивный просмотр страницы, но вы должны быть осторожны с этим, чтобы не попасть в ситуацию зацикливания / бесконечной рекурсии, кроме того , если у вас есть много элементов управления на странице, это может добавить много накладных расходов, чтобы постоянно все перебирать.

2
ответ дан 17 December 2019 в 20:30
поделиться

Вы можете создать быструю измененную версию паттерна наблюдателя. Я бы посоветовал создать на страницах управление яслями. Но если вы не хотите изменять страницу, вот быстрое решение.

Вы можете создать статический метод, который будет уведомлять все элементы управления одного типа. Вызывая их метод обновления. Не стесняйтесь передавать любые данные, которые вам нужны.

protected void control_event(object sender, EventArgs e)
{
    UpdateAllControls(page);
}


public static void UpdateAllControls(Control parent /* can be Page */)
        {
            foreach (Control c in parent.Controls)
            {
                if (c.GetType() == this.GetType())
                    ((MyType)).Update()
                if (c.HasControls())
                    controls = GetAllControls(controls, t, c);
            }
        }
0
ответ дан 17 December 2019 в 20:30
поделиться

Контейнерная страница имеет свойство в состоянии просмотра, в котором хранится состояние. Когда пользователь щелкает одну из страниц пейджера, возникает событие, которое обрабатывается страницей контейнера. Затем он проходит через n пользовательских элементов управления и вызывает общедоступный метод для этих элементов управления.

0
ответ дан 17 December 2019 в 20:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: