如何在我的代码中为Web用户控件注册事件处理程序?


1

我在设置窗体上的事件时遇到问题。这里的设置:

我给出两个控件,两个不同的版本为最终用户填写OUT-标准和高级形式的页面。这两种形式具有不同的代码和JavaScript,因此原始开发人员将它们放在单独的Web用户控件中。除了控件是LinkBut​​ton切换到高级模式。

<uc1:Standard runat="server" ID="StandardForm" /> 
<uc1:Advanced runat="server" ID="AdvancedForm" /> 
<asp:LinkButton runat="server" ID="lnkAdvanced" Text="Go To Advanced" OnClick="lnkAdvanced_Click" /> 

lnkAdvanced_Click只需将当前输入的所有信息都带入高级并翻转可见。

我的问题是老板的人希望“进入高级”按钮标准形式内,但。可见代码的页面上。所以我认为这可以使用一个事件来完成,但它似乎没有工作。

我试图建立这样一个事件:

public event EventHandler AdvanceClick; 

protected void lnkAdvanced_Click(object sender, EventArgs e) { 
    AdvanceClick(sender, e); 
} 

而当没有工作,我试图建立一个委托:

public delegate void AdvancedEventHandler(object sender, EventArgs e); 
public event AdvancedEventHandler AdvanceClick; 

当我移动的按钮,标准的形式,我预计能够类似于:

StandardForm.AdvanceClick += new AdvancedEventHandler(GoToAdvanced); 

但它似乎没有认出任何在控制范围内!我得到一个错误:“标准没有包含'AdvanceClick'的定义,并且没有任何扩展方法'AdvanceClick接受'Standard'类型的第一个参数可以找到”它发现其他属性就好了,我是否正在处理这个错误办法?

  0

你是如何申报的? 22 2月. 092009-02-22 06:48:21

  0

有些东西告诉我,整个控制设置是错误的,但很难在没有进一步细节的情况下为您提供帮助。我知道你已经提供了更多细节,但我认为它不够。至少你应该告诉我们各种代码片段在哪些文件中生活...... page1.aspx,control1.ascx等...... 22 2月. 092009-02-22 07:27:45

  0

谢谢大家确认我确实试图设置它正确的方式。无法引用该事件让我疯狂。 22 2月. 092009-02-22 17:27:57

0

如果标准表格中有“切换到高级”按钮。然后,显然,它必须知道高级表单,因此它们看起来相当紧密。如果是这样的话,我认为你可能只是将高级形式作为标准形式的孩子,然后...或者更好,将它们合并成一个控制。

如果您不喜欢这些选项,您可能想要创建第三个控制按钮和两个窗体的控件,以及在它们之间移动数据并切换其可见性的逻辑。

我个人推荐单一控制选项。控制紧张的控制通常会导致混乱。你可以用各种方式放松依赖,但在你这样做之前先仔细想一想。

在我目前工作的遗留项目中,我们有一堆例子,如serach表单和搜索结果被分成多个控件,但最后需要每个其他实例正常工作。正如我刚才所说,我不会推荐这条道路。

  0

这些控件不需要紧密耦合,如果逻辑委托给主机页面,那么“高级模式”可以随时切换到任何事物而无需修改标准控件,因为只有主机需要知道该怎么做。这是揭露事件的全部优势。 22 2月. 092009-02-22 08:04:45

  0

您真的认为一个名为“Go to Advanced”的按钮有多少用途?我的意思是,它不像其它任何东西,而是高级形式。如果是这样,我不认为这个按钮在它应该驻留在托管页面/控件中的标准格式上有什么要做。 22 2月. 092009-02-22 12:28:21

  0

这个设置很有趣。我认为这不像每个人都想做的那么复杂。我希望更多地了解控制要求,用例及其与彼此的关系。我只是猜测标准和高级控件并不意味着一次只能使用一个。 ;) 22 2月. 092009-02-22 12:38:53

  0

同意。有些设备会出现问题,而不是花时间搞清楚,我只是将这些表格作为“无论什么工作”的举措,从控制和面板中转移到面板上。感谢大家的帮助! :) 22 2月. 092009-02-22 17:25:01


0

你不应该需要委托,因为你已经创建了一个标准的事件。

尝试在您的形式负载点左右:

StandardForm.AdvanceClick += new EventHandler(GoToAdvanced); 

然后某个页面上承载2用户控制

protected void GoToAdvanced(object sender, EventArgs e) 
{ 
    //Code that was previously in lnkAdvanced_Click on page. 
} 

编辑:

这听起来像设置为错误。

你能张贴主机页面的标记(在这一点上,我们假定它只是2个用户控件)。

然后我们还假设AdvanceClick事件在标准UC声明,但错误信息将表明,它不..和lnkAdvanced_Click方法是在标准UC?

然后我们假定试图连接到自定义事件在主页声明的代码。

如果你能证实或否认我敢肯定,我们可以得到这样清理的假设。


1
// in your Standard user control 
public event EventHandler AdvancedClick; 

private void lbtnAdvanced_Click(object sender, EventArgs e) 
{ 
    OnAdvancedClick(e); 
} 

protected void OnAdvancedClick(EventArgs e) 
{ 
    if (AdvancedClick != null) 
     AdvancedClick(this, e); 
} 

// on your page 
StandardForm.AdvancedClick += new EventHandler(StandardForm_AdvancedClick); 

private void StandardForm_AdvancedClick(object sender, EventArgs e) 
{ 
    // toggle logic here 
} 
  0

这种方法将标准和高级表单耦合在一起,而不是将逻辑委托给主机页面。只要控制器的耦合不成问题,那么可以,但是我通常会在不需要时避免这种情况。 22 2月. 092009-02-22 07:16:42

  0

同意,我没有注意到他的切换逻辑在页面上的事实。我已经相应地更新了我的答案。 22 2月. 092009-02-22 07:25:10