【问题标题】:How to apply templates to controls in Forms?如何将模板应用到表单中的控件?
【发布时间】:2012-01-12 01:40:57
【问题描述】:

我想知道是否有一种方法可以为控件创建模板并将它们仅应用于某些控件。下面的函数对控件(GridView 和 Listbox)进行预定义设置,并将其应用于主窗体中的控件。问题是:

  1. 对其他形式的控件不起作用。
  2. 我无法指定它适用于哪些控件。

我确信有更好的方法,但我猜我的谷歌搜索比我的编程技能差。

    public void SettingControls()
    {
        List<Control> lstControls = GetAllControls(this.Controls);

        //DataGridView
        DataGridViewCellStyle style;
        style = new DataGridViewCellStyle();
        style.Alignment = System.Windows.Forms.DataGridViewContentAlignment.BottomCenter;
        style.BackColor = System.Drawing.Color.GhostWhite;
        style.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
        style.ForeColor = System.Drawing.Color.Black;
        style.SelectionBackColor = System.Drawing.SystemColors.Highlight;
        style.SelectionForeColor = System.Drawing.Color.Navy;
        style.WrapMode = System.Windows.Forms.DataGridViewTriState.True;

        DataGridViewAdvancedBorderStyle borderStyle;
        borderStyle = new DataGridViewAdvancedBorderStyle();
        borderStyle.Bottom = DataGridViewAdvancedCellBorderStyle.OutsetDouble;

        foreach (Control control in lstControls)
        {
            //DataGridView
            if (control is DataGridView)
            {
                DataGridView dgv = ((DataGridView)control);
                dgv.Dock = DockStyle.Fill;
                dgv.AutoGenerateColumns = true;
                dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;                    
                dgv.Dock = DockStyle.Fill;
                dgv.DefaultCellStyle.BackColor = Color.Bisque;
                dgv.BorderStyle = BorderStyle.FixedSingle;
                dgv.BackgroundColor = Color.GhostWhite;

                dgv.DefaultCellStyle = style;
            }                

            //ListBox
            if (control is ListBox)
            {
                ListBox lb = ((ListBox)control);
                lb.MeasureItem += new MeasureItemEventHandler(lb_MeasureItem);
                lb.DrawItem += new DrawItemEventHandler(lb_DrawItem);
            }
        }
    }

【问题讨论】:

    标签: c# winforms forms controls


    【解决方案1】:

    最简单的方法是创建一个其他表单继承自的基本表单,然后将上述方法添加为在 Form_Load 事件中调用的标准方法。

    例如:

    public class FormBase : Form
    {
        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            SettingControls();
        }
    
        // Declare as virtual to allow inheritors to override
        public virtual void SettingControls()
        {
            // Code here
        }
    }
    

    【讨论】:

    • @M.Babcock:我一点击保存就意识到这是winforms。我已经修复了答案以显示对 winforms 的正确响应。
    • 我从没想过继承会派上用场。谢谢。
    • @SiHyungLee:很高兴我能帮上忙!请记住,如果答案解决或帮助您解决问题,您应该点击复选标记,当您有足够的声誉时,点击适合您的答案旁边的向上箭头。谢谢!
    【解决方案2】:

    使用扩展方法。在你的项目中创建一个静态类并添加扩展方法:

    public static class Extensions
    {
        public static void SettingControls(this Form form)
        {
            List<Control> lstControls = GetAllControls(form.Controls);
            ...
        }
    }
    

    现在您可以使用以下之一调用它:

    this.SettingControls();  // If code is in a Form.
    
    myForm.SettingControls();  // If myForm is a Form.
    

    【讨论】:

      猜你喜欢
      • 2012-07-24
      • 2016-11-25
      • 1970-01-01
      • 2013-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多