Clickable Panel (Panel реализующая PostBack)

пятница, 10 июля 2009, Bobasoft

Привет )))

Это мой первый пост))).. так что прошу не бить)))

И так.. будет создавать ClickablePanel  - панелька.. которая умеет делать PostBack.

сначала сделаем каркас нашего елемента:

[ToolboxData("<{0}:ClickablePanel runat=server></{0}:ClickablePanel>")]
public class ClickablePanel : Panel
{
		public ClickablePanel()
			: base()
		{
		}
}

Генерируемые html-код будет:

Для того чтобы при клике на нашу панельку хоть чтото происходило... нужно добавить атрибут onClick... html-код должен быть примерно такоей:

Для этого переопределяем метод AddAttributesToRender() что вызвается при генерации html-кода. (Добавляет дополнительные дискрипторы до рендерируемого елемента.. в даном случаи для

)

Но сначала приведу процес генерации котрола:

 

Ну а теперь и код:

protected override void AddAttributesToRender(HtmlTextWriter writer)
{
        writer.AddAttribute(HtmlTextWriterAttribute.Onclick,
        Page.ClientScript.GetPostBackEventReference(this, String.Empty));
        base.AddAttributesToRender(writer);
}

Так как мы наследуемя от елемента Panel, то нужно чтобы и он сгенерил атрибуты, которые ему нужны.. поэтому пишем эту строчку: base.AddAttributesToRender(writer);

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

public class ClickablePanel : Panel, IPostBackEventHandler
{...}

При отправке страницы обратно, ASP.NET определяет, какой елемент инициировал отправку, и, если этот елемент реализует IPostBackEventHandler, вызывает метод RaisePostBackEvent() с данными события. Так как в этот момент все елементы на странице инициализируются, можно возбудить событие:

private EventHandler panelClicked;
public void RaisePostBackEvent(string eventArgument)
{
	OnPanelClicked(new EventArgs());
}
protected virtual void OnPanelClicked(EventArgs e)
{
     //Проверяем, иль есть хоть один подписчик на событие
	if (panelClicked != null)
		panelClicked(this, e);
}

Ну воть и все)))

Пример полного кода:

[ToolboxData("<{0}:ClickablePanel runat=server></{0}:ClickablePanel>")]
public class ClickablePanel : Panel, IPostBackEventHandler
{
	//======================================================
	#region _Constructors_

	public ClickablePanel()
		: base()
	{
	}

	#endregion
		
	//======================================================
	#region _Public properties, operators, constants and enums_
		
	public event EventHandler Click
	{
		add { panelClicked += value; }
		remove { panelClicked -= value; }
	}

	#endregion

	//======================================================
	#region _Private, protected, internal methods_

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

	protected override void AddAttributesToRender(HtmlTextWriter writer)
	{
		writer.AddAttribute(HtmlTextWriterAttribute.Onclick,
		Page.ClientScript.GetPostBackEventReference(this, String.Empty));
		base.AddAttributesToRender(writer);
	}

	public void RaisePostBackEvent(string eventArgument)
	{
		OnPanelClicked(new EventArgs());
	}
		
	#endregion

	//======================================================
	#region _Private, protected, internal fields_

	private EventHandler panelClicked;
		
	#endregion
}

А вот код странички:

<control:ClickablePanel id="ClickablePanel1" onclick="clickablepanel_click">
      какойто текст в панельки
</control:ClickablePanel>

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

Можете также запросто разместить внутри панельки.. например еще HyperLink, и тогда например когда пользователь нажимает на пустое место в пределах панели.. срабатывает отправка.. и когда он нажимает на линк внутри панельки.. то переходит на новую страницы))


Ищите нас в интернетах!

Комментарии

Свежие вакансии