1

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

我得到了一个带有两个控件的页面,两个不同版本的表单供最终用户填写——标准和高级。这两种形式有不同的代码和 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 代码在页面上。所以我认为可以使用事件来完成,但它似乎不起作用。

我试图设置这样的事件:

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

4

3 回答 3

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
}
于 2009-02-22T07:13:12.213 回答
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 中?

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

如果您可以确认或否认这些假设,我相信我们可以解决这个问题。

于 2009-02-22T07:06:43.853 回答
0

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

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

我个人推荐单一控制选项。拥有紧密耦合的控件通常只会导致混乱。您可以通过各种方式放松依赖关系,但在这样做之前要三思而后行。

在我目前工作的遗留项目中,我们有一堆示例,例如搜索表单和搜索结果被拆分为多个控件,但最终需要彼此的实例才能正常运行。正如我之前所说,我不会推荐这条路径。

于 2009-02-22T07:44:34.900 回答