2012-06-28 33 views
0

我试图创建一个使用自定义网格(子类)的控件(父类)。网格有一系列基于[parent]控件中属性值填充的构造函数和方法。可以访问父属性的私人子类型

我发现使这些属性值可用于网格的唯一方法是让它们为Shared,但这导致我所有类型的问题。

要求

  • 在控制(父)属性必须是网格(子)访问。
  • 控件中的属性必须在设计时属性浏览器中可见。
  • 网格类只能由父类实例化。

作为备注:请指出您的答案是否允许我在孩子和父母之间来回共享属性/方法。这将是很好的,但只是一个奖金。

感谢;)

编辑 - 根据我的情况很简单的例子:

Partial Public Class catContent 
    Inherits System.Web.UI.UserControl 

    Protected Sub Page_Load(sender, e) Handles Me.Load 
     Page.Controls.Add(New CategoryResultGrid(category)) 
    End Sub 

    Private Shared _product As String = String.Empty 

    Shared Property Product() As String 
     Get 
      Return _product 
     End Get 
     Set(ByVal value As String) 
      _product = value.Trim() 
     End Set 
    End Property 

    Private Class CategoryResultGrid 
     Inherits GridView 

     Sub New(ByVal category As String) 
      'How do I access "Product" here without sharing it? 
     End Sub 
    End Class 
End Class 

回答

0

不要使用共享的,它会只要你把你不止一个打破你的应用程序自定义控件在您的应用程序

如果您只希望网格存在于父控件的上下文中,那么请考虑将其暴露给类似于ListView控件公开其Items集合的方式。

如果您希望您的网格访问(父级)控件中的字段,有几种方法可以做到这一点。您可以将父实例传递给网格,您可以让网格使用标准的控制方法来获取其父引用,也可以将网格实现为父类的内部类。

+0

因此,鉴于上面我添加的例子,你会推荐什么?很明显,我想摆脱'共享'属性,但是如何将“产品”暴露给我的内部类? – Chiramisu

+0

当你说我可以引用父实例时,我最感兴趣的是什么?这绝对是我需要的,因为我将在各种页面上有多个这种控件的副本,所以内部网格绝对必须访问它们各自的父实例属性。 – Chiramisu

+0

只要内部类有引用,内部类甚至可以访问外部类的私有状态。所以,如果你添加一个'catContent'类型的附加构造函数arg到'CategoryResultGrid',然后在创建它时传递'Me',那么你应该全部设置。 – tcarvin