主页中的事件处理程序访问客户端页面中的控件

时间:2011-01-04 12:22:49

标签: c# asp.net webforms event-handling

我在母版页上有一个按钮,当点击它时,调用一个方法,该方法将以前保存到viewstate的EventHandler,此方法在客户端页面上,并执行它:

 protected void Save_Click(object sender, EventArgs e)
    {

        this.SaveButtonEvent += (EventHandler)ViewState["saveEvent"];
        if (this.SaveButtonEvent != null)
        {
            this.SaveButtonEvent(sender, e);

        }

    }

然后在客户端页面上调用一个非常简单的方法:

protected void Button2_Click(object sender, EventArgs e)
{

    Label1.Text = TextBox2.Text;
}

但是,TextBox2的值不正确,它是加载页面时设置的文本框的值(或者如果页面上的任何其他项目更改它),则不传递新值。

如果我向客户端页面添加一个按钮,直接调用Button2_Click事件,它将获得正确的值。

我没有得到正确的文本框值,因为从母版页调用了事件?任何解决方案?

我应该补充一点,这个按钮是动态创建的,事件委托会有所不同,这就是为什么我必须在运行时设置它。我需要一种方法来设置代理点击,并保持这个,直到它再次更改。

2 个答案:

答案 0 :(得分:1)

不,原因是您已在viewstate中保存了委托。

当您检索委托时,它仍然引用创建它的页面中的控件,因此您将使用不再存在的页面对象中的控件。

答案 1 :(得分:1)

您是否可以在主页面中公开可以在内容页面中处理的事件?

母版页:

public event EventHandler<EventArgs> AfterSave;
protected void Save_Click(object sender, EventArgs e)
{
    if(AfterSave != null) AfterSave(this, EventArgs.Empty);
}

内容页面:

protected void Page_Load(object sender, EventArgs e)
{
    MasterPageObject m = (MasterPageObject)base.Master;
    m.AfterSave += onMasterSave;
}
private void onMasterSave(object sender, EventArgs e)
{
    // Your processing here
}

- 帕维尔

相关问题