C# 如何将图像序列化到自定义DesignerSerializer

C# 如何将图像序列化到自定义DesignerSerializer,c#,serialization,codedom,C#,Serialization,Codedom,我为保存datagridview的usercontrol创建了一个自定义设计器 现在我尝试序列化datagridview的columns属性 集合可以容纳DataGridViewTextBoxColumn、DataGridViewComboxColumn、DataGridViewButtonColumn等 对于DataGridViewImageColumn,我从资源文件中获取图像。 我不知道如何从自定义CodeDomSerializer序列化image属性。 代码如下: public class

我为保存datagridview的usercontrol创建了一个自定义设计器

现在我尝试序列化datagridview的columns属性

集合可以容纳DataGridViewTextBoxColumn、DataGridViewComboxColumn、DataGridViewButtonColumn等

对于DataGridViewImageColumn,我从资源文件中获取图像。 我不知道如何从自定义CodeDomSerializer序列化image属性。 代码如下:

public class PanelDataGridViewCodeDomSerializer : CodeDomSerializer
{
    public override object Deserialize(IDesignerSerializationManager manager, object codeObject)
    {
        CodeDomSerializer baseClassSerializer = (CodeDomSerializer)manager.GetSerializer(typeof(PanelDataGridView).BaseType, typeof(CodeDomSerializer));
        return baseClassSerializer.Deserialize(manager, codeObject);
    }
    public override object Serialize(IDesignerSerializationManager manager, object value)
    {
        CodeDomSerializer baseClassSerializer = (CodeDomSerializer)manager.GetSerializer(typeof(PanelDataGridView).BaseType, typeof(CodeDomSerializer));
        // serialize the UserControl
        object codeObject = baseClassSerializer.Serialize(manager, value);
        if (codeObject is CodeStatementCollection)
        {
            CodeStatementCollection statements = (CodeStatementCollection)codeObject;
            // The code statement collection is valid, so add a comment.
            string commentText = "This comment was added to this object by a custom serializer.";
            CodeCommentStatement comment = new CodeCommentStatement(commentText);
            statements.Insert(0, comment);
            // serialize the inner DataGridView's columns
            if (value is PanelDataGridView)
            {
                DataGridViewColumnCollection innercolumns = (value as PanelDataGridView).zColumns;
                // declare the variable collection of columns in the inner DataGridView 
                List<CodeVariableReferenceExpression> parameter_list = new List<CodeVariableReferenceExpression>();
                CodeArrayCreateExpression createArray = null;
                CodeMethodInvokeExpression methodcall = null;

                int i = 1;

                CodeStatementCollection col_Statements = null;
                // Type is DataGridViewTextBoxColumn
                foreach (DataGridViewColumn col in innercolumns)
                {
                    /// serialize each column
                    col_Statements = new CodeStatementCollection();

                    CodeObjectCreateExpression col_ObjectCreate = new CodeObjectCreateExpression(col.GetType());

                    CodeVariableDeclarationStatement col_VariableDeclaration = new CodeVariableDeclarationStatement(col.GetType(), "column" + i.ToString());

                    CodeAssignStatement col_Assign_Create = new CodeAssignStatement(new CodeVariableReferenceExpression("column" + i.ToString()), col_ObjectCreate);
                    // serialize the DataPropertyName property of the column
                    CodeAssignStatement col_Assign_data_property_name = new CodeAssignStatement(new CodeVariableReferenceExpression("column" + i.ToString() + ".DataPropertyName"), new CodePrimitiveExpression(col.DataPropertyName));
                    // serialize the HeaderText property of the column
                    CodeAssignStatement col_Assign_header_text = new CodeAssignStatement(new CodeVariableReferenceExpression("column" + i.ToString() + ".HeaderText"), new CodePrimitiveExpression(col.HeaderText));

                    CodeAssignStatement col_Assign_image = null;
                    CodeAssignStatement col_Assign_image_layout = null;
                    if (col.GetType() == typeof(DataGridViewImageColumn))
                    {
                        DataGridViewImageColumn colImage = (DataGridViewImageColumn)col;
                        // serialize the Image property of the column
                        col_Assign_image = new CodeAssignStatement(new CodeVariableReferenceExpression("column" + i.ToString() + ".Image"), new CodePrimitiveExpression(colImage.Image.ToString()));
                        // serialize the ImageLayout property of the column
                        col_Assign_image_layout = new CodeAssignStatement(new CodeVariableReferenceExpression("column" + i.ToString() + ".ImageLayout"), new CodeFieldReferenceExpression(new CodeTypeReferenceExpression(typeof(DataGridViewImageCellLayout)), colImage.ImageLayout.ToString()));    
                    }
                    // serialize the Resizable property of the column
                    //CodeAssignStatement col_Assign_resizable = new CodeAssignStatement(new CodeVariableReferenceExpression("column" + i.ToString() + ".Resizable"), new CodeTypeReference(col.Resizable));
                    CodeAssignStatement col_Assign_resizable = new CodeAssignStatement(new CodeVariableReferenceExpression("column" + i.ToString() + ".Resizable"), new CodeFieldReferenceExpression(new CodeTypeReferenceExpression(typeof(DataGridViewTriState)),col.Resizable.ToString()));
                    // serialize the Visible property of the column
                    CodeAssignStatement col_Assign_visible = new CodeAssignStatement(new CodeVariableReferenceExpression("column" + i.ToString() + ".Visible"), new CodePrimitiveExpression(col.Visible));
                    // serialize the Width property of the column
                    CodeAssignStatement col_Assign_width = new CodeAssignStatement(new CodeVariableReferenceExpression("column" + i.ToString() + ".Width"), new CodePrimitiveExpression(col.Width));

                    CodeFieldReferenceExpression col_FieldReference = base.SerializeToExpression(manager, col) as CodeFieldReferenceExpression;
                    if (col_FieldReference == null)
                    {
                        col_Statements.Add(col_VariableDeclaration);
                        col_Statements.Add(col_Assign_Create);
                        col_Statements.Add(col_Assign_data_property_name);
                        col_Statements.Add(col_Assign_header_text);
                        if (col.GetType() == typeof(DataGridViewImageColumn))
                        {
                            col_Statements.Add(col_Assign_image);
                            col_Statements.Add(col_Assign_image_layout);
                        }
                        col_Statements.Add(col_Assign_resizable);
                        col_Statements.Add(col_Assign_visible);
                        col_Statements.Add(col_Assign_width);
                        parameter_list.Add(new CodeVariableReferenceExpression("column" + i.ToString()));
                    }

                    ///

                    statements.AddRange(col_Statements);
                    i++;
                }

                CodeFieldReferenceExpression target = base.SerializeToExpression(manager, value) as CodeFieldReferenceExpression;
                // if the designer hasn't all the columns to the inner DataGridView's column collection, add them by ourselves.
                if (target != null && parameter_list.Count > 0)
                {
                    createArray = new CodeArrayCreateExpression(typeof(DataGridViewColumn), parameter_list.ToArray());
                    methodcall = new CodeMethodInvokeExpression(new CodeVariableReferenceExpression(target.FieldName + ".zColumns"), "AddRange", createArray);

                    statements.Add(methodcall);
                }
            }
        }
        return codeObject;
    }
}
当设计器序列化控件时,我得到以下代码:

System.Windows.Forms.DataGridViewImageColumn column1;
        column1 = new System.Windows.Forms.DataGridViewImageColumn();
        column1.DataPropertyName = "frn_id";
        column1.HeaderText = "";
        column1.Image = "System.Drawing.Bitmap";
        column1.ImageLayout = System.Windows.Forms.DataGridViewImageCellLayout.Stretch;
        column1.Resizable = System.Windows.Forms.DataGridViewTriState.False;
        column1.Visible = true;
        column1.Width = 20;
        this.tableLayoutPanel1.SuspendLayout();
        this.SuspendLayout();
我希望我有这样的东西:

column1.Image = global::....SomePath....Resources.ico_right_arrow;
假设'global::..SomePath….'是指向我的资源文件的路径,而'ico_right_arrow'是我要检索的图像(此处的图标)的名称。
有什么想法吗?

所以你实际上不想序列化这些图像,而是想序列化它们的名称?@TaW:没错。我想从设计器中检索所选资源文件的名称(我的意思是在设计时)。
column1.Image = global::....SomePath....Resources.ico_right_arrow;