我在表单上设置事件时遇到问题。这是设置:
我获得了一个页面,其中包含两个控件,两个不同版本的表单,供最终用户填写标准版和高级版。这两个表单具有不同的代码和javascript,因此原始开发人员将它们放在单独的Web用户控件中。除了控件之外,还有一个LinkButton切换到高级模式。
<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接受'标准'类型的第一个参数”它发现其他属性就好了,我是不是错了方式是什么?
答案 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表单和搜索结果被分成多个控件,但最后需要其他实例才能正常运行。正如我先前所说,我不会推荐这条道路。