【问题标题】:Prevent UserControl public variables from being assigned to in Designer.cs防止在 Designer.cs 中分配 UserControl 公共变量
【发布时间】:2020-11-18 23:42:32
【问题描述】:

我有一个简单的用户控件,其中包含一些公共 StartDateEndDate DateTime 属性。我不希望这些默认设置在设计器中,但是当我将控件拖到新表单上时,它会在设计器代码中分配一个默认的 DateTime 对象。

有没有办法通过属性或类似的属性来解决这个问题?

****Designer Code on form that uses the control****

// 
// dateControl
// 
this.dateControl.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Right)));
this.dateControl.EndDate = new System.DateTime(((long)(0)));   // > Don't want this set here.
this.dateControl.Location = new System.Drawing.Point(35, 113);
this.dateControl.Margin = new System.Windows.Forms.Padding(3, 4, 3, 4);
this.dateControl.Name = "dateControl";
this.dateControl.Size = new System.Drawing.Size(282, 63);
this.dateControl.StartDate = new System.DateTime(((long)(0))); // > Don't want this set here.
this.dateControl.TabIndex = 249;











**** UserControl class ****

public partial class DatePeriodSelectionControl : UserControl
{
    public DatePeriodSelectionControl()
    {
        InitializeComponent();
    }

    public event EventHandler DateChanged;

    public DateTime StartDate
    {
        get
        {
            if (dateFrom?.EditValue is null) return DateTime.Today;
            return (DateTime) dateFrom?.EditValue;
        }
        set
        {
            if (dateFrom is null) return;
            dateFrom.EditValue = value;
        }
    }

    public DateTime EndDate
    {
        get
        {
            if (dateTo?.EditValue is null) return DateTime.Today;
            return (DateTime)dateTo?.EditValue;
        }
        set
        {
            if (dateTo is null) return;
            dateTo.EditValue = value;
        }
    }

    private void cbxDateRange_CloseUp(object sender, DevExpress.XtraEditors.Controls.CloseUpEventArgs e)
    {
        DateTimeHelper.GetDatesFromPeriodDescription(e.Value as string, out var dtFrom, out var dtTo);
        StartDate = dtFrom;
        EndDate = dtTo;
        DateChanged?.Invoke(sender, EventArgs.Empty);
    }

    private void dateFrom_CloseUp(object sender, DevExpress.XtraEditors.Controls.CloseUpEventArgs e)
    {
        StartDate = (DateTime)e.Value;
        DateChanged?.Invoke(sender, EventArgs.Empty);
    }

    private void dateTo_CloseUp(object sender, DevExpress.XtraEditors.Controls.CloseUpEventArgs e)
    {
        EndDate = (DateTime)e.Value;
        DateChanged?.Invoke(sender, EventArgs.Empty);
    }

    private void cbxDateRange_EditValueChanged(object sender, EventArgs e)
    {
        if (cbxDateRange.IsPopupOpen) return;

        DateTimeHelper.GetDatesFromPeriodDescription(cbxDateRange.EditValue as string, out var dtFrom, out var dtTo);
        StartDate = dtFrom;
        EndDate = dtTo;
        DateChanged?.Invoke(sender, EventArgs.Empty);
    }
}

【问题讨论】:

    标签: c# .net winforms user-controls


    【解决方案1】:

    是的,为了对设计器隐藏属性,您必须添加一些属性,[Browsable( false )][DesignerSerializationVisibility( DesignerSerializationVisibility.Hidden )] 应该这样做。

    /**** UserControl class ****/
    public partial class DatePeriodSelectionControl : UserControl
    {
        public DatePeriodSelectionControl()
        {
            InitializeComponent();
        }
    
        public event EventHandler DateChanged;
    
        [Browsable( false )]
        [DesignerSerializationVisibility( DesignerSerializationVisibility.Hidden )]
        public DateTime StartDate
        {
            get
            {
                if (dateFrom?.EditValue is null) return DateTime.Today;
                return (DateTime) dateFrom?.EditValue;
            }
            set
            {
                if (dateFrom is null) return;
                dateFrom.EditValue = value;
            }
        }
    
        [Browsable( false )]
        [DesignerSerializationVisibility( DesignerSerializationVisibility.Hidden )]
        public DateTime EndDate
        {
            get
            {
                if (dateTo?.EditValue is null) return DateTime.Today;
                return (DateTime)dateTo?.EditValue;
            }
            set
            {
                if (dateTo is null) return;
                dateTo.EditValue = value;
            }
        }
    
        private void cbxDateRange_CloseUp(object sender, DevExpress.XtraEditors.Controls.CloseUpEventArgs e)
        {
            DateTimeHelper.GetDatesFromPeriodDescription(e.Value as string, out var dtFrom, out var dtTo);
            StartDate = dtFrom;
            EndDate = dtTo;
            DateChanged?.Invoke(sender, EventArgs.Empty);
        }
    
        private void dateFrom_CloseUp(object sender, DevExpress.XtraEditors.Controls.CloseUpEventArgs e)
        {
            StartDate = (DateTime)e.Value;
            DateChanged?.Invoke(sender, EventArgs.Empty);
        }
    
        private void dateTo_CloseUp(object sender, DevExpress.XtraEditors.Controls.CloseUpEventArgs e)
        {
            EndDate = (DateTime)e.Value;
            DateChanged?.Invoke(sender, EventArgs.Empty);
        }
    
        private void cbxDateRange_EditValueChanged(object sender, EventArgs e)
        {
            if (cbxDateRange.IsPopupOpen) return;
    
            DateTimeHelper.GetDatesFromPeriodDescription(cbxDateRange.EditValue as string, out var dtFrom, out var dtTo);
            StartDate = dtFrom;
            EndDate = dtTo;
            DateChanged?.Invoke(sender, EventArgs.Empty);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-24
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      • 2021-12-06
      • 1970-01-01
      • 2011-09-09
      • 1970-01-01
      相关资源
      最近更新 更多