将控件中的对象强制转换为其父控件中的类

本文关键字:控件 对象 转换 | 更新日期: 2023-09-27 18:36:56

我正在尝试访问当前控件的父控件的成员。

这是家长:

public partial class Controls_MyPanel : System.Web.UI.UserControl
{
    private String _strSubTitle = String.Empty;
    public String SubTitle
    {
        get { return _strSubTitle; }
        set
        {
            _strSubTitle = value;
            lblSubTitle.Text = _strSubTitle;
        }
    }
}

这是子控件:

public partial class Controls_MyChild : System.Web.UI.UserControl
{
    function ChangeSubTitle
    {
        ((Controls_MyPanel)Parent.Parent).SubTitle = "Foo";
    }
}

我不知道如何将Controls_MyPanel的定义转换为Controls_MyChild。我不能使用using,因为我没有命名空间。我试着添加一些类似的东西:

<%@ Register src="MyPanel.ascx" tagname="MyPanel" tagprefix="uc1" %>

MyChild的标记,但这当然是循环的,因为MyChild已经在MyPanel上注册。

将控件中的对象强制转换为其父控件中的类

如果您创建了一个网站项目(使用ASP.net(而不是纯ASP.net应用程序,就会发生这种情况。

File->New->Web Sites...

而不是

File->New->Project...->Visual C#->Web->ASP.NET Web Application

在网站项目中,代码隐藏文件是在加载页面时动态编译的。它们是孤立的,所以除非在aspx/ascx文件中注册,否则不能引用类的名称,在您的情况下,这将创建循环依赖关系。

为了解决这个问题,如果您不想更改项目类型,可以使用接口。

  1. 右键单击网站项目,添加->添加新项目。。。

  2. 选择"类别"。如果要将文件放置在App_Code中,Visual Studio将提示您。对

  3. 在生成的文件中,将public class ClassName更改为public interface ISomeInterface。然后定义一个类似String SubTitle {get; set;} 的属性

  4. 在父控件中实现接口。

  5. 在您的子控件中,将Parent.Parent转换为ISomeInterface

然后您可以通过ISomeInterface接口访问SubTitle属性。