WinForms中StyleForm方法无法设置DataGridView样式的原因
问题原因及解决办法
问题根源
你的StyleForm方法只遍历了窗体的直接子控件,如果DataGridView是放在Panel、GroupBox这类容器控件内部的,就不会被遍历到,自然样式设置不会生效。而MenuStrip和StatusStrip一般是直接放在窗体根层级的,所以能被正常处理。
解决办法
修改代码,改成递归遍历所有控件(包括容器内部的子控件):
public static void StyleForm(Form f) { f.BackColor = Color.FromArgb(225, 225, 225); f.Font = new Font("Microsoft Sans Serif", 10); // 调用递归方法遍历所有控件 ApplyStyleToAllControls(f.Controls); } private static void ApplyStyleToAllControls(Control.ControlCollection controls) { foreach (Control control in controls) { if (control is StatusStrip statusStrip) { statusStrip.BackColor = Color.FromArgb(93, 107, 153); statusStrip.Font = new Font("Microsoft Sans Serif", 10); } else if (control is MenuStrip menuStrip) { menuStrip.Font = new Font("Microsoft Sans Serif", 10); } else if (control is DataGridView dgv) { dgv.RowHeadersVisible = false; dgv.DefaultCellStyle.SelectionBackColor = Color.FromArgb(196, 213, 255); dgv.GridColor = Color.Red; } // 如果当前控件是容器,递归遍历它的子控件 if (control.HasChildren) { ApplyStyleToAllControls(control.Controls); } } }
说明
- 新增
ApplyStyleToAllControls辅助方法,专门负责递归遍历所有控件 - 使用模式匹配(
is关键字直接转换类型)让代码更简洁 - 每次处理完当前控件后,判断它是否包含子控件,如果是就递归调用,确保所有嵌套层级的控件都能被处理到
内容的提问来源于stack exchange,提问作者Jocelyn
相关产品推荐
相关产品推荐

