我在使用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 :(得分: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;}
}