Боюсь, у меня довольно длинный вопрос. Я довольно новичок в ASP.NET, поэтому, пожалуйста, потерпите меня.
Я создал элемент управления для страницы ASP.NET, в которой перечислен ряд параметров. У каждой опции есть две интерактивные области (для простоты назовите их кнопками). Один для выбора опции и один для скрытия опции.
protected void Page_Load(object sender, EventArgs e)
{
RenderOptions();
}
public void RenderOptions()
{
for (int i = 0; i < 5; i++) {
HtmlGenericControl div1 = new HtmlGenericControl("div");
div1.Attributes.Add("onclick", ClientScript.GetPostBackEventReference(this, "option" + i));
m_TreeContainer.Controls.Add(div1);
HtmlGenericControl div2 = new HtmlGenericControl("div");
div2.Attributes.Add("onclick", ClientScript.GetPostBackEventReference(this, "option" + i));
m_TreeContainer.Controls.Add(div2);
}
}
public void RaisePostBackEvent(string arg)
{
//do something
}
Это прекрасно работает (я реализую интерфейс IPostBackEventHandler). Проблема здесь в том, что мне кажется, что нет способа узнать, какой элемент HTML был нажат и, следовательно, какое действие должно быть выполнено в методе RaisePostBackEvent.
Я пытался создать новый класс (HtmlDivControl), который выглядит следующим образом:
class HtmlDivControl : HtmlGenericControl, IPostBackEventHandler
{
#region Delegates
public delegate void ClickEventHandler(object sender, string eventArgument);
#endregion
#region Properties
private ClickEventHandler m_Click;
public ClickEventHandler Click
{
get { return m_Click; }
set { m_Click = value; }
}
#endregion
#region Constructors
public HtmlDivControl()
{
}
#endregion
public void RaisePostBackEvent(string eventArgument)
{
m_Click.Invoke(this, eventArgument);
}
}
Теперь я сделал div1 и div2 своим HtmlDivControl, а не HtmlGenericControl, установил свойство Click для метода (делегата) и передал сам div (div1 или div2) в качестве элемента управления для метода GetPostBackEventReference. На этот раз я мог не только различать div, но и заранее определить действие, которое должно быть выполнено. Однако RaisePostBackEvent для элементов управления вызывается после PageLoad. Поэтому проблема, с которой я сейчас сталкиваюсь, заключается в том, что весь элемент управления опциями отображается перед обработкой событий (и, таким образом, параметр, который, например, должен быть скрыт, не потому, что фактическое скрытие происходит после рендеринга). Перемещение вызова RenderOptions () в метод PageLoadComplete также не помогает, поскольку тогда элементы управления div еще не существуют.
Я почти уверен, что мне здесь не хватает чего-то совершенно фундаментального. Но может ли кто-нибудь объяснить мне, как я должен подходить к чему-то вроде этого?
p.s.
Как я должен писать подчеркивания здесь? Они используются, чтобы сделать текст курсивом? Есть какой-нибудь экранирующий персонаж?