none
Отображение документа, нужного пользователю RRS feed

  • Вопрос

  • Доброго времени суток!

    Очень нужна помощь!!

    Есть задача:

    Пользователь регистрирует свои действия.

    25.02.13 13:00 Выписал расходную накладную ... на сумму, кол-во и др. параметры
    25.02.13 13:10 Принял товар на склад ... на сумму, кол-во и др. параметры отличающиеся от расходной накладной
    25.02.13 13:20 Вернул поставщику брак ... на сумму, наименование, причина

    В каждой строке РАзные характеристики действия

    Формы документов "Расходная накладная", "Прием товара на склад" и "Возврат товара" содержаться
    в разных .aspx файлах.
    В таблице действия пользователя содержится только код пользователя, дата/время, тип документа и код документа,
    являющимся идентификатором записи в таблице, соответствующей этому документу.
    Вся остальная информация берется из ....

    Есть очень большое отягчающее обстоятельство! Тип документа содержится в справочной таблице (там же название .aspx
    файла, который нужно вызвать). Т.е. в любой момент в таблице может появиться документ "Перемещение со склада на склад" и название файла "transfer.aspx". И дополнительную информацию об этом документе нужно брать из этого "документа".

    Есть изумительная штука - ListView! Но нельзя задать шаблон ItemTemplate в зависимости от параметра записи.
    Могу сам создать разметку, но как вставить шаблон с передачей ему параметров? Или не шаблон.
    <--#include не подходит - нельзя явно передать параметры.
    UserControl нужно на прямую объявлять в странице. А о его существовании я не знаю. Пересобирать весь проект - не решение.
    Реализация ITemplate вроде как дает решение, но его можно использовать только в связке с соответсвующими контролами (ListView, Repeater и т.д.) отобразить в других частях страницы с передачей параметров как-то не получилось. Может я не прав. 

    Может у кого появятся мысли?

    25 февраля 2013 г. 14:16

Ответы

  • Если логику "спрятать" в сам контрол, то LoadControl("MyControl.ascx") приводить к конкретному типу не надо - достаточно к базовому Control например. Ну или отнаследовать ваши MyControl-ы не от UserControl а всунуть между в иерархию наследования свой класс - скажем MyUserControl c абстрактными методами Do1(), Do2() ... и тп Реальную логику напишете в конечный контролах отнаследованных от MyUserControl (это те контролы которые с разметкой ASCX). Тогда сможете на странице динамически грузить LoadControl("MyControl.ascx") кастить его к типу MyUserControl и вызывать свои кастомные методы / свойства. Если "снаружи" никаких данных не надо менять, то достаточно просто срендерить динамически, а логику контролов поместить в их OnLoad например. Если потом надо в code behind-е страницы эти контролы найти (скажем в OnRender - перед окончательной отправкой финальной разметки пользователю в браузер) - с помощью FindControl по ID (который можно также назначить в репитере) В общем вариантов много..

    Про информацию особенно примеры использования - часто можно найти полезные отеты на Stackoverflow.com - про  Eval для примера

    P.S. Если я ответил на ваш вопрос - не забудьте пожалуйста отметить мое сообщение как ответ. Если нет - уточните исходный вопрос, чтобы пользователя форума могли вам помочь.

    Спасибо


    Exclusive access to top developers. Remote job for top developers.

    • Помечено в качестве ответа _Selen 27 февраля 2013 г. 3:51
    26 февраля 2013 г. 16:01

Все ответы

  • Не уверен, что правильно понял суть проблемы. Но вот некоторые соображения по теме, которые, возможно, помогут вам.

    1. Если использовать DataSource контролов типа Repeater, ListView и т.п., то можно в обработчике события (не помню точно название) OnItemDataBound вытащить элемент данных соответствующий текущей строке в контроле и на основании свойств этого элемента сделать со строкой контрола все что вам нужно. 

    2. Возможно вам может пригодится динамическая подгрузка контролов через метод LoadControl. Можно например на основании данных отрендерить тот или иной контрол. (Тут правда если вам потом надо будет обрабатывать события в этих контролах - может быть не просто для динамических контролов)

    3. Почитайте также про Eval - возможно это вам тоже пригодится


    Exclusive access to top developers. Remote job for top developers.

    26 февраля 2013 г. 9:51
  • Спасибо за ответ!

    За OnItemDataBound отдельное спасибо!
    В данном случае он не помог, зато очень выручил в другом!
    Пару лишних запросов к БД снял.

    На сколько я понял OnItemDataBound происходит уже после рендеринга.
    Т.е. разметку на этом этапе я уже не менял бы! А то вдруг какая рекурсия выскочит! :)

    LoadControl штука хорошая, но во первых реализация обработки событий, а во вторых все равно
    необходимо преобразование его к конкретному типу объекта CType(LoadControl("MyControl.ascx"), MyControl)
    т.е. нужно заранее иметь референс на контрол внутри страницы. А я его не имею.

    Про Eval тоже спасибо! Прочитал внимательнее. Есть куда двигаться.
    Только документация MS не блещет красноречием!

    А как было бы хорошо сделать так, как в других системах!
    <asp:placeholder id="document" .....>
    include("<%# eval("document_name") %>.aspx?koddocumenta=<%# eval("document_kod") %>")
    </asp:placeholder>
    И все! И никаких проблем!

    26 февраля 2013 г. 13:38
  • Если логику "спрятать" в сам контрол, то LoadControl("MyControl.ascx") приводить к конкретному типу не надо - достаточно к базовому Control например. Ну или отнаследовать ваши MyControl-ы не от UserControl а всунуть между в иерархию наследования свой класс - скажем MyUserControl c абстрактными методами Do1(), Do2() ... и тп Реальную логику напишете в конечный контролах отнаследованных от MyUserControl (это те контролы которые с разметкой ASCX). Тогда сможете на странице динамически грузить LoadControl("MyControl.ascx") кастить его к типу MyUserControl и вызывать свои кастомные методы / свойства. Если "снаружи" никаких данных не надо менять, то достаточно просто срендерить динамически, а логику контролов поместить в их OnLoad например. Если потом надо в code behind-е страницы эти контролы найти (скажем в OnRender - перед окончательной отправкой финальной разметки пользователю в браузер) - с помощью FindControl по ID (который можно также назначить в репитере) В общем вариантов много..

    Про информацию особенно примеры использования - часто можно найти полезные отеты на Stackoverflow.com - про  Eval для примера

    P.S. Если я ответил на ваш вопрос - не забудьте пожалуйста отметить мое сообщение как ответ. Если нет - уточните исходный вопрос, чтобы пользователя форума могли вам помочь.

    Спасибо


    Exclusive access to top developers. Remote job for top developers.

    • Помечено в качестве ответа _Selen 27 февраля 2013 г. 3:51
    26 февраля 2013 г. 16:01