Пользовательские элементы управления C #: что я делаю не так - PullRequest
0 голосов
/ 27 ноября 2018

У меня нет большого опыта создания пользовательских элементов управления в C #, но у меня была амбициозная идея для компонента, который я хочу сделать (честолюбив для меня, не @ меня;)).

Я хотелсоздать элемент управления, который показывает только соответствующие контекстуальные свойства во время разработки.И мне удалось сделать это, используя интерфейсы и расширяемые свойства.(Вопрос не за горами).

Вот соответствующая часть кода, который я использую для проверки этого:

namespace SmartGrid
{
    #region MAIN CLASS
    [Serializable]
    public partial class SmartColumnV2 : UserControl
    {
        private ColumnType mColumnType;
        private Boolean mDesignMode;
        private ColumnBase mColumns;

        public SmartColumnV2()
        {
            InitializeComponent();
            mDesignMode = DesignMode;
            mColumns = new SmartColumnLabel();
        }

        #region muhPublicProperties

        [Category("Column Settings"),
        Description("Define the type of cells that the column will host"),
        RefreshProperties(RefreshProperties.All)]
        public ColumnType ColumnType
        {
            get
            {
                return mColumnType;
            }
            set
            {
                mColumnType = value;
                switch(mColumnType)
                {
                    case ColumnType.LabelCol:
                        mColumns = new SmartColumnLabel();
                        break;
                    case ColumnType.ComboCol:
                        mColumns = new SmartColumnCombo();
                        break;
                    case ColumnType.Spinner:
                        mColumns = new SmartColumnNumeric();
                        break;
                }
            }
        }


        [Category("Column Settings"),
        Description("Element specific and Cell specific Settings"),
        DesignerSerializationVisibility(DesignerSerializationVisibility.Visible | DesignerSerializationVisibility.Content),
        TypeConverter(typeof(ExpandableObjectConverter))]
        public ColumnBase Columns
        {
            get
            {
                return mColumns;
            }
            set
            {
                mColumns = value;
            }
        }

        #endregion
    }
    #endregion

    #region MAIN Interface
    public interface ColumnBase
    {

    }
    #endregion



    #region Smart Label Column
    public class SmartColumnLabel : ColumnBase
    {

        //const string DesignerSerializationSavedSettingsFileName = "smss.dat"; //smart column serialization settings data     

        private ObservableCollection<Label> mColumnElements;

        public SmartColumnLabel()
        {
            mColumnElements = new ObservableCollection<Label>();
        }

        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public ObservableCollection<Label> Elements
        {
            get
            {
                return mColumnElements;
            }
            set
            {
                mColumnElements = value;
            }
        }
    }
    #endregion



    #region Smart Combo Column
    public class SmartColumnCombo : ColumnBase
    {
       ...
    }
    #endregion



    #region Smart Column Spinner
    public class SmartColumnNumeric : ColumnBase
    {
       ...
    }
    #endregion    
}

Я построил его и поместил этот компонент в форму для его проверки.

Я добавил две метки в наблюдаемую коллекцию во время разработки следующим образом:

Example of how I added the two labels to the ObservableCollection

И проверил, сгенерировал ли разработчик соответствующий код, и он это сделал!

partial class Form1
{
    /// <summary>
    /// Required designer variable.
    /// </summary>
    private System.ComponentModel.IContainer components = null;

    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

    #region Windows Form Designer generated code

    /// <summary>
    /// Required method for Designer support - do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
        SmartGrid.SmartColumnLabel smartColumnLabel1 = new SmartGrid.SmartColumnLabel();
        this.smartColumnV21 = new SmartGrid.SmartColumnV2();
        this.label1 = new System.Windows.Forms.Label();
        this.label2 = new System.Windows.Forms.Label();
        this.SuspendLayout();
        // 
        // smartColumnV21
        // 
        this.smartColumnV21.AutoSize = true;
        this.smartColumnV21.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
        this.smartColumnV21.BackColor = System.Drawing.SystemColors.Info;
        smartColumnLabel1.Elements.Add(this.label1);
        smartColumnLabel1.Elements.Add(this.label2);
        this.smartColumnV21.Columns = smartColumnLabel1;
        this.smartColumnV21.ColumnType = SmartGrid.V2.SmartTypes.ColumnType.LabelCol;
        this.smartColumnV21.Location = new System.Drawing.Point(319, 114);
        this.smartColumnV21.MaximumSize = new System.Drawing.Size(150, 0);
        this.smartColumnV21.MinimumSize = new System.Drawing.Size(150, 29);
        this.smartColumnV21.Name = "smartColumnV21";
        this.smartColumnV21.Size = new System.Drawing.Size(150, 29);
        this.smartColumnV21.TabIndex = 0;
        // 
        // label1
        // 
        this.label1.Location = new System.Drawing.Point(0, 0);
        this.label1.Name = "label1";
        this.label1.Size = new System.Drawing.Size(100, 23);
        this.label1.TabIndex = 0;
        this.label1.Text = "label1";
        // 
        // label2
        // 
        this.label2.Location = new System.Drawing.Point(0, 0);
        this.label2.Name = "label2";
        this.label2.Size = new System.Drawing.Size(100, 23);
        this.label2.TabIndex = 0;
        this.label2.Text = "label2";
        // 
        // Form1
        // 
        this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
        this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
        this.ClientSize = new System.Drawing.Size(800, 450);
        this.Controls.Add(this.smartColumnV21);
        this.Name = "Form1";
        this.Text = "Form1";
        this.ResumeLayout(false);
        this.PerformLayout();

    }

    #endregion

    private SmartGrid.SmartColumnV2 smartColumnV21;
    private System.Windows.Forms.Label label1;
    private System.Windows.Forms.Label label2;
}

ВОПРОС # 1

Почему, если я сохраню это, закрою решение и снова открою его, я не смогу увидеть изменения, сделанные во время разработки, дажеесли автоматически сгенерированный код все еще там?

enter image description here

Я хочу, чтобы изменения, сгенерированные дизайнером, были доступны в конструкторе, если я сохраню и вернусь, но это, похоже, не помогает, несмотря на то, что автоматически сгенерированный код все еще там ...

ВОПРОС # 2 Что мне нужно сделать, чтобы достичь этого?Что я сделал не так?

Я использую MS Visual Studio Community 2017

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...