【发布时间】:2010-07-23 16:54:10
【问题描述】:
我的页面上有一个标签控件和自定义用户控件。我希望,当 UserControl 中出现某些内容时,它应该更改,例如 Label 的 Text 属性(正如我所提到的,Label 不属于 UserControl)。该怎么做?
【问题讨论】:
标签: asp.net user-controls
我的页面上有一个标签控件和自定义用户控件。我希望,当 UserControl 中出现某些内容时,它应该更改,例如 Label 的 Text 属性(正如我所提到的,Label 不属于 UserControl)。该怎么做?
【问题讨论】:
标签: asp.net user-controls
最好的办法是使用某种事件来通知包含页面 UserControl 已更新。
public class MyControl : UserControl {
public event EventHandler SomethingHappened;
private void SomeFunc() {
if(x == y) {
//....
if(SomethingHappened != null)
SomethingHappened(this, EventArgs.Empty);
}
}
}
public class MyPage : Page {
protected void Page_Init(object sender, EventArgs e) {
myUserControl.SomethingHappened += myUserControl_SomethingHappened;
}
private void myUserControl_SomethingHappened(object sender, EventArgs e) {
// it's Business Time
}
}
这只是一个基本示例,但我个人建议使用设计器界面来指定用户控件的事件处理程序,以便在您的设计器代码隐藏中处理分配,而不是在您正在处理的代码中处理。
【讨论】:
UserControl 应该是可重用的,因此要正确执行此操作,您应该使用 Page 挂钩的 UserControl 中的事件,即:
public NewTextEventArgs : EventArgs
{
public NewTextEventArgs(string newText)
{
_newText = newText;
}
public NewText
{
get { return _newText; }
}
}
然后将以下事件添加到您的 UserControl:
public event OnNewText NewText;
public delegate void OnNewText(object sender, NewTextEventArgs e);
然后从用户控件触发事件:
private void NotifyNewText(string newText)
{
if (NewText != null)
{
NewText(this, new NewTextEventArgs(newText));
}
}
然后只需在您的 Page 上使用该事件,并且 UserControl 和 Page 不再紧密耦合:
然后处理事件并将文本设置为您的标签:
protected void YourControl1_NewText(object sender, NewTextEventArgs e)
{
Label1.Text = e.NewText;
}
【讨论】:
public event EventHandler<NewTextEventArgs> NotifyNewText;您可以通过从您的自定义 UserControl 引发事件来实现这一点。然后页面可以拦截该事件并相应地修改标签的 Text 属性:
【讨论】:
您可以使用 Page 属性来访问用户控件的页面包含。试试:
((Page1)this.Page).Label1.Text = "Label1 文本";
【讨论】: