的背景C#用戶控件設計時系列化
我正在定製的WinForms控制。控件將公開的DataGridView控件與公共屬性之一結合在一起。
我已經實現了自定義DesignerActionList和ControlDesigner,以便爲DataGridView列操作(添加,刪除,更改屬性值)提供可視界面。這工作正常:當我將控件添加到新窗體時,可以添加列,並在設計時顯示。 sceenshot
目前我即將實施的能力列狀態
我實現了自定義的Deisger串行保存到{}控制了.Designer.cs如下:
public class GridDesignerSerializer : CodeDomSerializer
{
public override object Serialize(IDesignerSerializationManager manager, object value)
{
var baseSerializer = (CodeDomSerializer)manager.GetSerializer(
typeof(Grid).BaseType,
typeof(CodeDomSerializer));
object codeObject = baseSerializer.Serialize(manager, value);
// now add some custom code
if (codeObject is CodeStatementCollection)
{
// add a custom comment to the code.
var statements = (CodeStatementCollection)codeObject;
statements.Add(new CodeCommentStatement("This is GridDesignerSerializer generated code BEGIN:"));
// HERE COMPONENT INITIALIZATION INVOKES WILL BE PLACED.
statements.Add(new CodeCommentStatement("This is GridDesignerSerializer generated code :END"));
}
return codeObject;
}
}
而且附加控制類系列化屬性:
[Designer(typeof(Grid_Designer))]
[DesignerSerializer(typeof(GridDesignerSerializer), typeof(CodeDomSerializer))]
public partial class Grid : UserControl
{ ...
技術問題
當我在設計時將新列添加到我的自定義控件DataGridView中時,設計人員檢測不到更改(vs文檔選項卡沒有*)。所以當我關閉設計視圖序列化沒有發生。
當我改變其他控制屬性(讓我們說:改變邊框樣式)更改被檢測到並執行自定義序列化(額外的評論顯示在設計師內部)。
問題
如何通知Desiger改變由地方(列,其中加的),並執行序列化?
Inside
GridDesignerSerializer
如何反駁設計時間DataGridView實例迭代添加的列來執行代碼生成?
感謝您的任何建議。
[IComponentChangeService](https://msdn.microsoft.com/en-us/library/system.componentmodel.design.icomponentchangeservice( v = vs.110).aspx) –
創建一個'CodeDomSerializer'的原因是什麼? –
原因:在{Control} .Designer.cs中爲設計時添加到DataTreeView的列生成代碼。類似於: {Control} .DataGridView.Columns.Add(...); –