【问题标题】:Accessing user control from a page in another namespace从另一个命名空间中的页面访问用户控件
【发布时间】:2013-04-11 11:01:22
【问题描述】:

我的问题似乎很简单,但我找不到解决方案。

我有一个 aspx 如下:

namespace WebApplication3.asp_x
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }
    }
}

和一个ascx如下:

namespace WebApplication3.asc_x
{
    public partial class WebUserControl1 : System.Web.UI.UserControl
    {
        protected void Page_Load(object sender, EventArgs e)
        {

        }

        public LinkButton lbTest
        {
            get {
                return this.lbTest;
            }
        }
    }
}

从 aspx 文件中,我想访问公共属性 lbTest 并执行以下操作,但它不起作用(它无法编译)

namespace WebApplication3.asp_x
{
    public partial class _Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            LinkButton lb = WebApplication3.asc_x.WebUserControl1.lbTest;
        }
    }
}

谁能告诉我这里缺少什么?

【问题讨论】:

  • 请提供编译器错误信息。它应该会告诉您问题出在哪里。
  • 编译器说:错误 1 ​​非静态字段、方法或属性“WebApplication3.asc_x.WebUserControl1.lbTest.get”需要对象引用。 Intellisense 也不建议这样做。我只是写它来表达我需要什么样的访问权限。

标签: c# asp.net oop


【解决方案1】:

我认为这是一个奇怪的电话

LinkButton lb = WebApplication3.asc_x.WebUserControl1.lbTest;

因为你需要一个实例来调用它的标签。

如果您在页面上有 usercontrol 的实例,那么您可以将其称为公共属性。

namespace WebApplication3.asp_x
{
   public partial class _Default : System.Web.UI.Page
   {
      protected void Page_Load(object sender, EventArgs e)
      {
        WebApplication3.asc_x.WebUserControl1 ob=new WebApplication3.asc_x.WebUserControl1();
        LinkButton lb = ob.lbTest;
      }
   }
}

编辑 1

您需要首先找到placeholer
然后找到user-control就位hoder
然后找到链接按钮。

假设您的页面中有一个占位符 p1
找到如下

PlaceHolder p=(PlaceHolder)Page.FindControl('p1');   

然后在占位符 p 中找到用户控件,如下所示
假设您在占位符中有用户控件uc1

UserContro1 uc1=(UserControl1)p.FindControl("uc1");

然后你可以在这个里面找到链接
作为这个

LinkButton lb = uc1.lbTest;

【讨论】:

  • 我知道,但是如何创建用户控件的实例?
  • 感谢您的回答。你说的已经对了。问题是,这个问题是我遇到的问题的简化版本,在那个真实场景中,用户控件不是直接在 aspx 页面中,而是在一个占位符中,并且这个占位符通过 sitecore 与 ascx 相关联。这就是为什么我在代码隐藏中没有用户控件实例。
  • 一个后续问题。我需要将此 LinkBut​​ton 注册到脚本管理器更新面板。但是,如果我像您提供的那样手动创建一个实例,它将不适用于脚本管理器,因为该实例不是将在页面运行时创建的实例。是真的吗?
  • 你可以使用findcontrol我正在更新我的答案
【解决方案2】:

使用 用户控件的 ID 访问任何属性。
给定的 Id 实际上是 codebehind 中的 usercontrol 的实例名称

它不是像 WebApplication3.asc_x.WebUserControl1.lbTest 那样访问的静态属性

【讨论】:

  • 如何查看实例的id是什么?我有课,但它没有 id。
  • 您是否在默认页面中使用用户控件?
  • 感谢您的回答。你说的已经对了。问题是,这个问题是我遇到的问题的简化版本,在那个真实场景中,用户控件不是直接在 aspx 页面中,而是在一个占位符中,并且这个占位符通过 sitecore 与 ascx 相关联。这就是为什么我在代码隐藏中没有用户控件实例。
【解决方案3】:

您必须实例化用户控件(创建一个新对象)。

例子:

LinkButton lb = (new WebApplication3.asc_x.WebUserControl1()).lbTest;

或者类似的东西。 除非它已经是您页面上的控件;然后只需使用服务器 ID。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-16
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    相关资源
    最近更新 更多