2009-08-06 76 views
0

我有一个相当长的问题,我很害怕。我对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. 我该如何在这里写下划线?他们习惯使文本斜体?有一些逃生角色吗?

+1

你想用这个控件做什么?我的建议是远离自定义控件类,如果你是新来的ASP.Net – John 2009-08-06 14:57:59

+0

Page_Load是微软想出来的东西,而不是我:-)另外,这似乎不是一个很好的理由来打破使用一个非常有效的字符。但这是一个完全不同的讨论。 @John:如果我要远离自定义控件,那么我将如何学习ASP.NET的更复杂的方面?澄清一下,我并没有在ASP.NET或编程方面迈出第一步,只是我现在进入了一个我不完全熟悉的领域。根据我发布的内容,您可能会看到我正朝着一个错误的方向前进。如果是这样,请给我正确的方法。 – Jerry 2009-08-06 15:21:44

+0

我之前提到的原因是,除非您打算在其他项目中重新使用此控件,否则几乎总是使用内置控件更简单/更优雅的解决方案,或者至少通过创建UserControl – John 2009-08-06 16:24:46

回答

2

对于新来ASP.Net的人来说,目前为止你做得相当不错。这里的障碍实际上就是你对这个问题的思考方式。你应该很好地掌握ASP.Net页面生命周期 - 你错过了一些非常基本的东西。

简而言之,你希望你的页面重建它的状态,就像回发之前的状态一样。然后处理你的事件。然后进行任何状态更改。

你在想它,就好像你的html控件应该知道它在请求开始时的状态改变,这是不正确的。首先必须进行重建阶段。这对ASP.Net甚至能够找出要提出的事件至关重要。

我会建议他:

  1. 将您的 “RenderOptions()” 方法将Page_Init处理程序。如果您将ViewState整合到您的控件中,这将为您节省很多问题。 (我也会重命名它,因为它没有真正呈现任何东西,只是将你的控件添加到页面中.Redder在ASP.Net中有特定的上下文)。

  2. 然后,在您的控件的OnClick事件处理程序中,只需根据需要设置控件的可见性,而不是试图控制它们的呈现方式。它始终是太多更简单的将控件设置为Visible = False,而不是试图改变控件呈现给页面的方式。请记住,如果您设置Visible = False,则会向该控件的响应发送零html,但服务器仍然知道它在页面上,因此您仍然可以处理它。

想想你的事件处理程序是你要改变页面状态的地方。这是你的逻辑应该在这种情况下,而不是在Page_Load。

相关问题