2015-01-09 3 views
0

Я пытаюсь получить доступ к элементу родительского элемента управления текущего элемента управления.Передача объекта в элемент управления классу в его родительском элементе

Вот родитель:

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.

+0

У вас должен быть доступ к нему уже. Они - если вы не определили их в разных пространствах имен - в том же пространстве имен. Какую ошибку вы получаете? – dbugger

+0

Это просто говорит: «Тип или имя пространства имен« Controls_MyPanel »не удалось найти (вам не хватает директивы using или ссылки на сборку?)' –

+0

Они находятся в одном проекте? – dbugger

ответ

3

Это произойдет, если вы создали проект веб-сайта (с ASP.net) вместо чистого приложения ASP.net.

File->New->Web Sites... 

вместо

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

в веб-проекте сайта, код за файл компилируется динамически при загрузке страницы. Они изолированы, поэтому вы не можете ссылаться на имя класса, если вы не зарегистрируетесь в файле aspx/ascx, который в вашем случае будет создавать циклическую зависимость.

Для решения проблемы, если вы не хотите изменять тип проекта, вы можете использовать интерфейс.

  1. правой кнопкой мыши проект веб-сайта, Добавить-> Добавить новый элемент ...

  2. Выберите "Class". Visual Studio предложит вам разместить файл в App_Code. Да.

  3. В сгенерированном файле сменить public class ClassName на public interface ISomeInterface. Затем определите свойство, подобное String SubTitle {get; set;}

  4. Внедрите интерфейс в свой родительский элемент управления.

  5. В вашем контроле за ребенком, бросил Parent.Parent в ISomeInterface

Тогда вы можете получить доступ к SubTitle собственности через интерфейс ISomeInterface.

+0

Спасибо. Я закончил делать что-то другое, где я получил ярлык напрямую с помощью вызова «FindControl», но этот ответ все равно может быть полезен для других в том же месте. –

Смежные вопросы