【问题标题】:Where to set custom control defaults在哪里设置自定义控件默认值
【发布时间】:2013-11-04 16:43:21
【问题描述】:

这个问题让我有点难过。我正在使用一些合理的默认值创建一个派生的System.Windows.Forms.DataGridView 控件。现在为了明确这一点,它们只是默认值,应该能够在设计器中进行更改。截至目前,我在控件构造函数中设置了默认值:

using System.Drawing;
using System.Windows.Forms;

namespace TruckSmart.Controls
{
    /// <summary>
    /// An implementation of a System.Windows.Forms.DataGridView with sensible default values.
    /// </summary>
    public class DataGrid : System.Windows.Forms.DataGridView
    {
        /// <summary>
        /// Initializes a new instance of the TruckSmart.Controls.DataGrid class.
        /// </summary>
        public DataGrid()
        {
            AllowUserToAddRows = false;
            AllowUserToDeleteRows = false;
            AllowUserToOrderColumns = false;
            AllowUserToResizeColumns = false;
            AllowUserToResizeRows = false;
            AutoGenerateColumns = false;
            AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells;
            AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.DisplayedCells;
            BackgroundColor = SystemColors.Window;
            BorderStyle = BorderStyle.Fixed3D;
            ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.None;
            Margin = new Padding(0);
            MultiSelect = false;
            ReadOnly = true;
            RowHeadersVisible = false;
            SelectionMode = DataGridViewSelectionMode.FullRowSelect;

            AlternatingRowsDefaultCellStyle = new DataGridViewCellStyle()
            {
                BackColor = Color.FromKnownColor(KnownColor.AliceBlue)
            };

            ColumnHeadersDefaultCellStyle = new DataGridViewCellStyle()
            {
                WrapMode = DataGridViewTriState.False
            };
        }
    }
}

使用构造函数的主要问题是,当我在 Visual Studio 中关闭表单设计器并重新打开它时,会再次调用构造函数,并且我之前在设计器中所做的任何更改都会被重置。我应该把这些默认值放在一个特殊的地方吗?

【问题讨论】:

    标签: c# winforms custom-controls default-value windows-forms-designer


    【解决方案1】:

    很遗憾,您将不得不自己重新实现这些属性:

    [DefaultValue(false)]
    public new bool AllowUserToAddRows {
      get { return base.AllowUserToAddRows; }
      set { base.AllowUserToAddRows = value; }
    }
    

    关键字 new 将覆盖或隐藏基本属性,然后允许您对其进行更改。 DefaultValue 属性不会“设置”属性的值,它只是被设计器用来确定是否将值写入设计器文件。您仍然需要在构造函数中设置默认值。

    【讨论】:

    • @CrisMcLaughlin 这行得通。看起来这是最简单的解决方案。我不知道为什么有些人不喜欢使用new 来跟踪基本成员,但它在某些情况下非常有用,例如这种情况。
    • 事实证明它确实有效。我设置了错误的属性...再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    相关资源
    最近更新 更多