2012-05-25 7 views
3

Мне нужно получить доступ к элементам управления, созданным CreateChildControls() из другого класса, так что, когда я выбираю файл, у меня есть путь к строке, на которую нужно ссылаться.Доступ к элементам управления, созданным CreateChildControls()

Я попытался решением в Accessing controls created dynamically (c#) и Problem in accessing dynamically created controls Но не радости благодаря

publicTextBox txtUrl; 

    protected override void CreateChildControls() 
    { 
     Label lblUrl = new Label(); 
     lblUrl.ID = "lblUrl"; 
     lblUrl.Text = "Url: "; 
     Controls.Add(lblUrl); 

     TextBox txtUrl = new TextBox(); 
     txtUrl.ID = "txtUrl"; 
     Controls.Add(txtUrl); 

     AssetUrlSelector picker = new AssetUrlSelector(); 
     picker.ID = "ausUrl"; 

     picker.DefaultOpenLocationUrl = OpenUrl; 
     picker.AssetUrlClientID = txtUrl.ClientID; 
     picker.AssetUrlTextBoxVisible = false; 
     Controls.Add(picker); 

     Control control = Page.LoadControl(_ascxPath); 
     Controls.Add(control); 

    } 

Из другого класса я должен иметь возможность получить доступ к текстовому полю

protected void Button1_Click(object sender, EventArgs e) 
    { 
     AssetPicker asspi = new AssetPicker(); 

     string aaa = asspi.txtUrl.Text; 



    } 

ответ

5

я должен был сделать контроль общественного быть доступен из другого класса. но он возвращает нулевую опорную ошибку. Я обновил первое сообщение

Если вы подвергаете ваш ребенок управляет публично, вам нужно позвонить EnsureChildControls в поглотителе для каждого публично подвергается контролю за детьми. Это заставит выполнить CreateChildControls, и, следовательно, ваше дерево управления будет создано, гарантируя, что вызывающий объект не получит нулевую ссылку.

т.д .:

public Button MyChildButton 
{ 
    get 
    { 
     EnsureChildControls(); 
     return _myChildButton; 
    } 
} 
private Button _myChildButton; 

... 

protected override void CreateChildControls() 
{ 
    ... 
    _myChildButton = new Button(); 
    ... 
} 

Обратите внимание, что для того, чтобы сделать это, вам нужно выставить свои дочерние элементы в качестве свойств, а не поля. То есть в примере кода, вам нужно заменить:

public TextBox txtUrl; 

по:

public TextBox TxtUrl 
{ 
    get 
    { 
     EnsureChildControls(); 
     return txtUrl; 
    } 
} 
private TextBox txtUrl; 

Вы также должны наследовать от CompositeControl, что делает что-то подобное для Controls собственности:

public override ControlCollection Controls 
{ 
    get 
    { 
     EnsureChildControls(); 
     return base.Controls; 
    } 
} 

Если по какой-то причине вы не наследуете от CompositeControl, тогда вам нужно будет добавить этот элемент управления в свой класс.

Кстати, выставлять дочерние элементы управления может слишком много информации для ваших абонентов, которые, вероятно, не должны беспокоиться о таких деталях реализации. Вместо этого вы можете выявить только соответствующие свойства ваших дочерних элементов управления. Например, вместо того, чтобы обнажая ребенка TextBox TxtUrl, вы можете выставить строковое свойство Url таким образом:

public string Url 
{ 
    get 
    { 
     EnsureChildControls(); 
     return txtUrl.Text;    
    } 
    set 
    { 
     EnsureChildControls(); 
     txtUrl.Text = value; 
    } 
} 
+1

Привет, спасибо за ваш помощник Я попробовал второй бит кода, теперь он возвращает предупреждение: txtUrl никогда не назначается и всегда будет иметь значение по умолчанию null – user1211929

+0

"никогда не назначается и всегда будет иметь значение по умолчанию null" - в в этом случае вам нужно назначить его, что вы должны сделать в методе CreateChildControls - «txtUrl = new TextBox();» и т. д., а не «TextBox txtUrl = новый TextBox();» – Joe

0

В конце концов, что .NET когда вы добавляете статический элемент управления на страницу, он будет содержать ссылку как элемент управления как поле (обычно они идут в файл .designer). Таким образом, просто поместите элементы управления, как поля в той же манере:

private Label lblUrl; 
private TextBox txtUrl; 
private AssetUrlSelector picker; 
private Control control; 

protected override void CreateChildControls() 
{ 
    lblUrl = new Label(); 
    lblUrl.ID = "lblUrl"; 
    lblUrl.Text = "Url: "; 
    Controls.Add(lblUrl); 

    txtUrl = new TextBox(); 
    txtUrl.ID = "txtUrl"; 
    Controls.Add(txtUrl); 

    picker = new AssetUrlSelector(); 
    picker.ID = "ausUrl"; 

    picker.DefaultOpenLocationUrl = OpenUrl; 
    picker.AssetUrlClientID = txtUrl.ClientID; 
    picker.AssetUrlTextBoxVisible = false; 
    Controls.Add(picker); 

    control = Page.LoadControl(_ascxPath); 
    Controls.Add(control); 
} 
+0

Кроме того, если вам нужно взаимодействовать с вашим «контроль» в общем виде, вы можете сделать все элементы управления, может наследовать тот же базовый класс, который обеспечит необходимый интерфейс для взаимодействия. – ivowiblo

+1

Спасибо, я попробовал, но мне пришлось сделать доступными элементы управления для доступа из другого класса. но он возвращает нулевую опорную ошибку. Я обновил начальную запись – user1211929

+0

Проблема в том, что вы получаете доступ к элементам управления до вызова CreateChildControls. Что вам нужно делать с элементами управления? Возможно, вам придется подождать до другого события элемента управления или страницы, прежде чем обращаться к ним.Кроме того, я бы предложил не выставлять элементы управления, а только то, что вам нужно использовать (не разговаривать с шаблоном незнакомцев). – ivowiblo

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