C# ASP.NET пользовательский контроль как обрабатывать div click server side?

Я создаю пользовательский элемент управления. Пользовательский элемент управления-это div, и я хочу добавить к нему событие click.

Edit:

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

Как я могу это сделать?

4 ответов


во-первых, вам нужно определить событие на вашем UserControl, что позволит Page С UserControl для регистрации и обработки события. Например:

public partial class MyUserControl : System.Web.UI.UserControl
{    
    // Event for page to handle
    public event EventHandler DivClicked;

    protected virtual void OnDivClicked(EventArgs e)
    {
        if (DivClicked != null)
            DivClicked(this, e);
    }        

    protected void Page_Load(object sender, EventArgs e)
    {
        // Page Load Code goes here
    }
}

Примечание.: Следующая часть была бы проще, если бы вы использовали элемент управления, поддерживающий обратные связи. Однако, поскольку вы хотите использовать div, я объясню, как силу div делать обратные ссылки. Я хотел бы поблагодарить Nolton Настюша для этого решения.

так, в Page_Load метод UserControl вы должны добавить onClick атрибут для вызова ASP.NET s __doPostback() функция javascript, которая вызывает сервер обратно для вашего div. Это то, что дает div возможность обратной передачи на сервер. Кроме того, чтобы определить, какой элемент управления вызвал обратную передачу, я поставил div ' s ClientId вместе с некоторыми символами, чтобы отличить мою обратную передачу от других элементов управления. Помните, когда вы определяете div на .ascx-файл должен иметь id назначена и runat="server", to быть доступным на стороне сервера.

Ок, теперь, добавив до div, он будет возвращаться на сервер в любое время его щелчка. Итак, когда postback вызывает Page_Load чтобы получить вызов, я проверяю, был ли это div что вызвало обратную передачу. Если это так, я поднимаю UserControl ' s DivClicked событие, которое будет обрабатываться странице.

public partial class MyUserControl : System.Web.UI.UserControl
{
    // Event Definition and Raising methods
    ...

   protected void Page_Load(object sender, EventArgs e)
   {
       // @@@@ will denote this is an argument I provided.
       string arg = "@@@@" + divClickableDiv.ClientID;
       // Add postback method to onClick 
       divClickableDiv.Attributes.Add("onClick", 
       Page.ClientScript.GetPostBackEventReference(divClickableDiv, arg));

       if (IsPostBack)
       {
           // Get event arguments for post back.
           string eventArg = Request["__EVENTARGUMENT"];

           // Determine if postback is a custom postback added by me.
           if (!string.IsNullOrEmpty(eventArg) && eventArg.StartsWith("@@@@"))
           {
               // Raise the click event for this UserControl if the div
               // caused the post back.
               if (eventArg == arg) 
                   OnDivClicked(EventArgs.Empty);
            }
        }
    }
}

что это UserControl, теперь все, что вам нужно сделать, это зарегистрироваться на DivClicked событие на страница.

к сожалению, вы не получите поддержку времени разработки для регистрации на мероприятие. Тем не менее, вы все равно можете добавить код в .страница ASPX. На странице, где вы уроните UserControl добавить атрибут к UserControl под названием OnXXX где XXX-это событие имени. Итак, для моего примера выше я бы определил my UserControl на странице будет выглядеть так:

<uc1:MyUserControl  ID="MyUserControl1" runat="server" OnDivClicked="MyUserControl1_DivClicked" />

теперь вы добавляете код обработчика в Pageфайл codebehind (при условии, что вы используете codebehind), как это:

public partial class MyPage : System.Web.UI.Page 
{
    // Called whenever div in MyUserControl is clicked.
    protected void WebUserControl1_DivClicked(object sender, EventArgs e)
    {
        // Handle Div click event here.
    }
}

это должно сделать это. Надеюсь, этот пост поможет вам.


<div runat="server" onserverclick="MyClickHandler">
...
</div>

ответ Роки близок, но не совсем правильный (как в нем не сработало для меня, и я понял, почему).

биты кода для usercontrol Rocka в порядке: // Событие для обработки страницы публичное мероприятие EventHandler DivClicked;

protected virtual void OnDivClicked(EventArgs e) 
{ 
    if (DivClicked != null) 
        DivClicked(this, e); 
} 

при использовании UserControl следующее не будет работать:

OnDivClicked не является обработчиком событий, это функция, поэтому вы не можете ее назначить. не говоря уже о том, когда функция срабатывает, фактическое событие переменная обработчика имеет значение null, поэтому она ничего не будет выполнять.

правильный путь был бы:

Это назначило бы MyUserControl1_DivClicked быть обработчиком для DivClicked. К сожалению, это на самом деле не работало, поэтому в коде на странице Page_Load поместите эту строку:

этого.MyUserControl1.OnClick += новый EventHandler (MyUserControl1);

кроме того, в качестве примечания, если вы сделаете div runat= "server", то OnClick выставляется как событие, к которому вы могли подключиться. Все, что вам нужно, это свойство passthru для EventHandler в пользовательском элементе управления div.


в вашем ItemTemplate используйте asp: панель вместо div tag (панель отображается как div) и установите свойство видимости следующим образом:

<asp:Panel ID="ImgFeatured" runat="server" CssClass="featured-ribbon"> </asp:Panel>

код

Panel ImgFeatured = (Panel)e.Row.FindControl("ImgFeatured");
ImgFeatured.Visible = true;