【问题标题】:ASP.NET How to change Page controls via custom UserControl?ASP.NET 如何通过自定义 UserControl 更改页面控件?
【发布时间】:2010-07-23 16:54:10
【问题描述】:

我的页面上有一个标签控件和自定义用户控件。我希望,当 UserControl 中出现某些内容时,它应该更改,例如 Label 的 Text 属性(正如我所提到的,Label 不属于 UserControl)。该怎么做?

【问题讨论】:

    标签: asp.net user-controls


    【解决方案1】:

    最好的办法是使用某种事件来通知包含页面 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
        }
    }
    

    这只是一个基本示例,但我个人建议使用设计器界面来指定用户控件的事件处理程序,以便在您的设计器代码隐藏中处理分配,而不是在您正在处理的代码中处理。

    【讨论】:

    • 我是这么认为的,但是如何在我的页面上捕捉到这个事件?
    【解决方案2】:

    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;
    }
    

    【讨论】:

    • @Nathan Taylor - 我删除了最初的答案并替换为更好的事件驱动答案。
    • 好东西!只是一个快速提示,使用通用 EventHandler 不再需要为您的自定义 eventargs 类创建委托。你可以简单地做public event EventHandler<NewTextEventArgs> NotifyNewText;
    • @Nathan - 谢谢。我不知道!
    【解决方案3】:

    您可以通过从您的自定义 UserControl 引发事件来实现这一点。然后页面可以拦截该事件并相应地修改标签的 Text 属性:

    http://asp.net-tutorials.com/user-controls/events/

    【讨论】:

      【解决方案4】:

      您可以使用 Page 属性来访问用户控件的页面包含。试试:

      ((Page1)this.Page).Label1.Text = "Label1 文本";

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        • 1970-01-01
        • 2011-07-13
        • 2011-05-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多