У меня нет большого опыта создания пользовательских элементов управления в 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
}
Я построил его и поместил этот компонент в форму для его проверки.
Я добавил две метки в наблюдаемую коллекцию во время разработки следующим образом:
И проверил, сгенерировал ли разработчик соответствующий код, и он это сделал!
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
Почему, если я сохраню это, закрою решение и снова открою его, я не смогу увидеть изменения, сделанные во время разработки, дажеесли автоматически сгенерированный код все еще там?
Я хочу, чтобы изменения, сгенерированные дизайнером, были доступны в конструкторе, если я сохраню и вернусь, но это, похоже, не помогает, несмотря на то, что автоматически сгенерированный код все еще там ...
ВОПРОС # 2 Что мне нужно сделать, чтобы достичь этого?Что я сделал не так?
Я использую MS Visual Studio Community 2017