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

时间:2015-01-09 22:46:39

标签: c# asp.net

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

这是父母:

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上注册。

1 个答案:

答案 0 :(得分:3)

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

File->New->Web Sites...

而不是

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

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

要解决此问题,如果您不想更改项目类型,可以使用interface。

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

  2. 选择“班级”。如果要将文件放在App_Code中,Visual Studio将提示您。是

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

  4. 的属性
  5. 在父控件中实现界面。

  6. 在您的儿童控件中,将Parent.Parent转为ISomeInterface

  7. 然后,您可以通过SubTitle界面访问ISomeInterface媒体资源。