2016-08-03 15 views
2

的背景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文檔選項卡沒有*)。所以當我關閉設計視圖序列化沒有發生。

當我改變其他控制屬性(讓我們說:改變邊框樣式)更改被檢測到並執行自定義序列化(額外的評論顯示在設計師內部)。

問題

  1. 如何通知Desiger改變由地方(列,其中加的),並執行序列化?

  2. Inside GridDesignerSerializer如何反駁設計時間DataGridView實例迭代添加的列來執行代碼生成?

感謝您的任何建議。

+0

[IComponentChangeService](https://msdn.microsoft.com/en-us/library/system.componentmodel.design.icomponentchangeservice( v = vs.110).aspx) –

+0

創建一個'CodeDomSerializer'的原因是什麼? –

+0

原因:在{Control} .Designer.cs中爲設計時添加到DataTreeView的列生成代碼。類似於: {Control} .DataGridView.Columns.Add(...); –

回答

1

OK,我想點1解決下面:

我加在我的控制類:

private IComponentChangeService GetChangeService() 
    { 
     return (IComponentChangeService)GetService(typeof(IComponentChangeService)); 
    } 

然後裏面方法/屬性,負責變化檢測:

this.GetChangeService().OnComponentChanged(this, null, null, null); 

因此,當我向DataGridView添加一列時,*在文檔選項卡上顯示,保存自定義序列化後爲p erformed。

點2也: 在我的情況中,添加以下代碼內GridDesignerSerializer

VAR網格=((網格)的值); (新的CodeCommentStatement(「Column Count:」+ grid.List.Columns.Count.ToString()));

通常序列化對象的實例是Serialize方法第二個參數:

Serialize(IDesignerSerializationManager manager, object value)