2014-02-08 3 views
0

В каком случае при первоначальной загрузке пользовательского элемента управления WinForms (унаследованного от TextBox) можно и целесообразно надежно ссылаться на родительскую форму?Как надежно ссылаться на содержащую форму

Обнаружив, одно обсуждение, которое я нашел, охватывает эту область: .NET WinForms Custom Control: how to get a reference to the containing form. В частности, проводка на adrift затрагивает проблему, которая до тех пор, пока пользовательский элемент управления не будет добавлен в родительскую форму (и произойдет событие OnParentChanged), FindForm вернет значение null.

Исходя из этого, рекомендуется использовать событие OnParentChanged. К сожалению, я обнаружил, что если пользовательский элемент управления содержится в другом элементе управления (например, панели), то этот контейнер необязательно будет добавлен в коллекцию управления формой, и FindForm вернет значение null даже в событие OnParentChanged пользовательского элемента управления.

В результате возникает вопрос, есть ли лучшее событие для использования, которое надежно разрешает использование FindForm для возврата родительской формы настраиваемого элемента управления (даже если оно помещено в другой элемент управления контейнером).

+0

В отличии от сайтов форума, мы не используем «Спасибо» или «Любую помощь приветствуется», или подпись на [так]. См. «[Должны ли« Привет »,« спасибо », теги и приветствия удалены из сообщений?] (Http://meta.stackexchange.com/questions/2950/should-hi-thanks-taglines-and-salutations-be –

+0

И, кстати, вы имели в виду «благодарно полученные», а не «очень полученные». –

+0

Крис, с благодарностью также означает маркировку ответов или, по крайней мере, комментирование предложенных ответов ;-) –

ответ

1

Основываясь на моем понимании вашей проблемы, вы, вероятно, можете реализовать интерфейс ISupportInitialize в своем настраиваемом элементе управления.

Это позволит вызывать код управления методом InitializeComponent() вашей формы.

Например, этот простой пользовательский элемент управления, вытекающие из кнопки:

class MyButton : Button, ISupportInitialize 
{ 
    public void BeginInit() 
    { 
     var parent = this.TopLevelControl; 
    } 

    public void EndInit() 
    { 
     var parent = this.TopLevelControl; 
    } 
} 

При размещении на форме, код конструктора будет выглядеть следующим образом:

private void InitializeComponent() 
{ 
    this.myButton1 = new Quartz1.MyButton(); 
    ((System.ComponentModel.ISupportInitialize)(this.myButton1)).BeginInit(); 
    this.SuspendLayout(); 
    // 
    // myButton1 
    // 
    this.myButton1.Location = new System.Drawing.Point(371, 338); 
    this.myButton1.Name = "myButton1"; 
    this.myButton1.Size = new System.Drawing.Size(75, 23); 
    this.myButton1.TabIndex = 4; 
    this.myButton1.Text = "myButton1"; 
    this.myButton1.UseVisualStyleBackColor = true; 
    // 
    // Form1 
    // 
    this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); 
    this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; 
    this.ClientSize = new System.Drawing.Size(1012, 440); 
    this.Controls.Add(this.myButton1); 
    this.Name = "Form1"; 
    this.Text = "Form1"; 
    ((System.ComponentModel.ISupportInitialize)(this.myButton1)).EndInit(); 
    this.ResumeLayout(false); 
    this.PerformLayout(); 
} 

Как вы можете видеть, как только Инициализация формы завершена, EndInit() вызывается в вашем элементе управления. На данный момент this.TopLevelControl не будет пустым.

Я не уверен, что это то, что вы ищете, если не пожалуйста, не стесняйтесь добавлять больше контекста к вашему вопросу.

Приветствие

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