2015-08-21 4 views
1

У меня проблема с использованием форм C#. Моя основная форма называется Form1, из которой я могу открыть дочернюю форму с именем x в качестве диалога.Настройка параметров родительской формы от дочернего

Когда я вызываю функцию в моей дочерней форме x, я хочу, чтобы все остальные формы и основная форма были затронуты ею.

public void Change_Layout_Red(System.Windows.Forms.Control Container) 
{ 
    if (rb_EmberRed.Checked == true) 
    { 
     try 
     { 


      foreach (Control ctrl in Container.Controls) 
      { 
       if (ctrl.GetType() == typeof(TextBox)) 
        ((TextBox)ctrl).BackColor = Color.Red; 
       if (ctrl.GetType() == typeof(ComboBox)) 
        ((ComboBox)ctrl).BackColor = Color.Red; 
       if (ctrl.GetType() == typeof(DataGridView)) 
        ((DataGridView)ctrl).BackColor = Color.Red; 
       if (ctrl.GetType() == typeof(Label)) 
        ((Label)ctrl).ForeColor = Color.White; 
       if (ctrl.GetType() == typeof(TabPage)) 
        ((TabPage)ctrl).BackColor = Color.Black; 
       if (ctrl.GetType() == typeof(Panel)) 
        ((Panel)ctrl).BackColor = Color.Red; 
       if (ctrl.GetType() == typeof(RadioButton)) 
        ((RadioButton)ctrl).ForeColor = Color.White; 
       if (ctrl.Controls.Count > 0) 
        Change_Layout_Red(ctrl); 

      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 
    } 


} 

При нажатии на кнопку в виде ребенка, я хочу, чтобы эта функция работать и применять ко всем формам доступных, она станет как значение по умолчанию.

private void btn_ChangeLayout_Click(object sender, EventArgs e) 
{ 
    Change_Layout_Red(Form1.ActiveForm); 
} 

Этот код изменяет цвета только в активной дочерней форме.

Во-первых, есть ли способ, чтобы эта функция меняла значения по умолчанию для всех новых открытых подформ? Во-вторых, как я могу получить доступ к элементу управления в основной форме Form1? Я попытался добавить Form1.((TextBoX)ctrl).Backcolor = Color.Red в первую функцию, но он не работает.

Благодаря

+0

Вашего Form1.ActiveForm является формой ребенка, поэтому она содержит только те элементы управления дочерней формы для доступа к элементам управления вашей родительской формы вы можете захотеть используйте Form1.Parent вместо Form1.ActiveForm. –

+0

@MeAndSomeRandoms вы правы, но эта опция недоступна –

+0

foreach (Форма frm в Application.OpenForms) Change_Layout_Red (frm); –

ответ

2

Вы можете создать базовую форму и добавить в него свойство, как

public virtual Layout Layout { get; set; } //Se below 

Затем, в виде ребенка, вы можете получить доступ к своему родителю:

(Form1.Parent as MyCustomForm).Layout = new Layout(Color.Red); 

В родительской форме вы можете перебирать дочерние формы и изменять их макеты:

public virtual Layout Layout { 
    get {return _layout; } 
    set { 
    if (IsMdiContainer) { 
     foreach (MyCustomForm item in MdiChildren.Cast<MyCustomForm>()) { 
     item.Layout = value; 
     } 
    } 
    foreach (Control ctrl in Container.Controls) { 
     //Apply layout settings to controls 
    } 
    } 

Класс макета может быть что-то вроде этого:

class Layout { 
    public Layout(Color color) { 
    //Initialize the properties values based on the selected color 
    } 
    public Color TextBoxForeColor {get; set;} 
    public Color TextBoxBackColor {get; set;} 
    public Color LabelForeColor {get; set;} 
    public Color LabelBackColor {get; set;} 
} 
Смежные вопросы