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

时间:2009-02-22 06:40:37

标签: c# event-handling web-user-controls

我在表单上设置事件时遇到问题。这是设置:

我获得了一个页面,其中包含两个控件,两个不同版本的表单,供最终用户填写标准版和高级版。这两个表单具有不同的代码和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只会将当前输入的所有信息带到高级版并翻转Visible。

我的问题是其中一位老板想要标准表格内的“进入高级”按钮,但.Visible代码在页面上。所以我认为可以使用一个事件来完成,但它似乎没有用。

我尝试设置这样的事件:

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接受'标准'类型的第一个参数”它发现其他属性就好了,我是不是错了方式是什么?

3 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:0)

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

尝试加载表格:

StandardForm.AdvanceClick += new EventHandler(GoToAdvanced);

然后在托管2个用户控件的页面上某处

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

编辑:

听起来好像设置错了。

你可以发布主页的标记(此时我们假设它只是2个用户控件)。

然后我们还假设在标准UC中声明了AdvanceClick事件,但是错误消息表明它没有..而且lnkAdvanced_Click方法在标准UC中?

然后我们假设在Host页面中声明了尝试附加到自定义事件的代码。

如果你能证实或否认这些假设,我相信我们可以解决这个问题。

答案 2 :(得分:0)

如果标准表单具有“切换到高级”按钮。然后,很明显,它必须知道高级形式,因此它们看起来非常紧密耦合。如果是这种情况,在我看来,您可能只是将高级表单作为标准表单的子项...然后更好,将它们合并到一个控件中。

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

我个人推荐单一控制选项。具有紧密耦合的控制通常只会导致混乱。你可以通过各种方式放松依赖,但在你这样做之前要仔细考虑。

在我目前正在处理的遗留项目中,我们有一些示例,例如serach表单和搜索结果被分成多个控件,但最后需要其他实例才能正常运行。正如我先前所说,我不会推荐这条道路。