我有一个相当长的问题,我很害怕。我对ASP.NET很新,所以请耐心等待。 我已经建立了一个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中,单击属性设置为一个方法(委托)并传递div(div1或div2)本身作为GetPostBackEventReference方法的控件。这一次,我不仅可以区分不同的divs,还可以预先确定应该执行的操作。但是,控件的RaisePostBackEvent在PageLoad之后调用。所以我现在所面临的问题是整个选项控件在处理事件之前就被渲染(因此,应该隐藏的选项并不是因为实际的隐藏发生在渲染之后)。将RenderOptions()调用移动到PageLoadComplete方法也没有帮助,因为div控件将不存在。
我很确定我在这里错过了一些非常基本的东西。但是,有人可以解释我应该如何处理这样的事情吗?
p.s. 我该如何在这里写下划线?他们习惯使文本斜体?有一些逃生角色吗?
你想用这个控件做什么?我的建议是远离自定义控件类,如果你是新来的ASP.Net – John 2009-08-06 14:57:59
Page_Load是微软想出来的东西,而不是我:-)另外,这似乎不是一个很好的理由来打破使用一个非常有效的字符。但这是一个完全不同的讨论。 @John:如果我要远离自定义控件,那么我将如何学习ASP.NET的更复杂的方面?澄清一下,我并没有在ASP.NET或编程方面迈出第一步,只是我现在进入了一个我不完全熟悉的领域。根据我发布的内容,您可能会看到我正朝着一个错误的方向前进。如果是这样,请给我正确的方法。 – Jerry 2009-08-06 15:21:44
我之前提到的原因是,除非您打算在其他项目中重新使用此控件,否则几乎总是使用内置控件更简单/更优雅的解决方案,或者至少通过创建UserControl – John 2009-08-06 16:24:46