Повторитель шаблона управления с настраиваемыми событиями - PullRequest
1 голос
/ 09 июня 2011

Я пишу шаблон элемента для повторителя в отдельном элементе управления, а затем использую следующий код:

HospitalRepeater.DataSource = LocationsList;
HospitalRepeater.ItemTemplate = Page.LoadTemplate("~/UserControls/HospitalDetails.ascx");
HospitalRepeater.DataBind();

Этот код работал нормально, однако теперь мы хотим добавить пользовательские события в элемент управления HospitalDetails.

Мы создали следующее событие с пользовательскими аргументами события:

public class HospitalItemEventArgs : EventArgs
{
    public Int32 HospitalID { get; set; }

    public HospitalItemEventArgs() { }

    public HospitalItemEventArgs(Int32 hID)
    {
        this.HospitalID = hID;
    }
}


public event EventHandler<HospitalItemEventArgs> HospitalAction;

protected virtual void OnHospitalAction(HospitalItemEventArgs e)
{
    if (HospitalAction!= null)
        this.HospitalAction(this, e);
}

Теперь возникает проблема - я не могу получить доступ к этому пользовательскому событию из своего кода после загрузки этого элемента управления в качестве шаблона, поскольку он возвращает объект System.Web.UI.ITemplate. Я предположил, что это обертка выше моего точного контроля, но это предположение неверно.

Сбой приведения к моему типу управления со следующим сообщением об ошибке:

Unable to cast object of type 'SimpleTemplate' to type 'UserControls.HospitalDetails'.

Я пробовал обратное действие - управление нагрузкой с использованием

Page.LoadControl("~/UserControls/HospitalDetails.ascx");

Возвращает объект правильного типа HospitalDetails, но не реализует интерфейс ITemplate.

Когда я пытался это сделать, я получил сообщение об ошибке:

Unable to cast object of type 'ASP.usercontrols_hospitaldetails_ascx' to type 'System.Web.UI.ITemplate'.

Может ли кто-нибудь помочь мне разобраться с этим составом или найти другое решение, которое соответствует следующим требованиям:

  • Повторитель должен быть привязан к списку HospitalItems для отображения деталей.
  • Шаблон для отображения деталей должен скрывать взаимодействие с пользовательским интерфейсом и отображать несколько простых событий, таких как HospitalAction с идентификатором больницы.
  • Отдельный объект должен иметь возможность подписываться на эти события.

1 Ответ

0 голосов
/ 09 июня 2011

Лучше всего создать несколько элементов управления <asp:Button /> с атрибутами CommandName и CommandArgument. Затем вы можете обрабатывать всплывающее окно даже на самом ретрансляторе, опрашивая аргументы для CommandName и CommandArgument.

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

<asp:Repeater ID="myRepeater" runat="server">
    <ItemTemplate>
        <asp:Button ID="SaveButton"
                    CommandName="Save" 
                    CommandArgument="{insert hospitol ID here}" 
                    Text="Save"
                    runat="server" />
    </ItemTemplate>
</asp:Repeater>

    void myRepeater_ItemCommand(object source, RepeaterCommandEventArgs e)
    {
        if (e.CommandName == "Save")
        {
            int id = int.Parse(e.CommandArgument.ToString());
            //Do some saving
        }
    }

Обновление

Назначение атрибутов кнопки CommandArgument и CommandName состоит в том, чтобы предоставить пользователю индивидуальные действия для выполнения содержимого пользовательского интерфейса с привязкой к данным. Атрибут CommandArgument позволяет вам вернуться в данные, чтобы получить соответствующую информацию для события. Я никогда не пытался поместить несколько значений в этот атрибут, но я не вижу причины, по которой он не будет работать.

Другой вариант - создать отдельный список, который содержит ассоциации HospitalID и DoctorID, создать уникальный идентификатор для каждой ассоциации и сохранить этот список в базе данных (если вам необходимо сохранить его), кэш (если используется несколькими пользователями), сеанс (если используется несколькими страницами одним и тем же пользователем) или Viewstate (если используется одна страница и список относительно короткий).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...