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.
}
}
это должно сделать это. Надеюсь, этот пост поможет вам.
ответ Роки близок, но не совсем правильный (как в нем не сработало для меня, и я понял, почему).
биты кода для 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;