Hi,
I am using this CodeDomSerializer to serialize some datagridviewcolumns into the form designer,However it seems to have a issue when properties of the datagridviewcolumn is changed, ie backcolor or alignment. Problem being it writes duplicate constructors for the datagridviewcolumn in the designer.
Can anyone help plz.
Public
Overrides Function Serialize(ByVal manager As System.ComponentModel.Design.Serialization.IDesignerSerializationManager, ByVal value As Object) As Object
Dim baseClassSerializer As CodeDomSerializer = DirectCast(manager.GetSerializer(GetType(WWSearchDataGrid).BaseType, GetType(CodeDomSerializer)), CodeDomSerializer)
Dim codeObject As Object = baseClassSerializer.Serialize(manager, value)
If TypeOf codeObject Is CodeStatementCollection Then
Dim statements As CodeStatementCollection = DirectCast(codeObject, CodeStatementCollection)
Dim commentText As String = "This comment was added to this object by a custom serializer"
Dim comment As CodeCommentStatement = New CodeCommentStatement(commentText)
statements.Insert(0, comment)
If TypeOf value Is WWSearchDataGrid Then
Dim columns As DataGridViewColumnCollection = TryCast(value, WWSearchDataGrid).Columns
Dim parameter_list As List(Of CodeVariableReferenceExpression) = New List(Of CodeVariableReferenceExpression)
Dim createArray As CodeArrayCreateExpression = Nothing
Dim methodcall As CodeMethodInvokeExpression = Nothing
Dim cmf As CodeMemberField = Nothing
Dim cmfs As List(Of CodeMemberField) = New List(Of CodeMemberField)
Dim i As Integer = 1
Dim col_Statements As CodeStatementCollection = Nothing
For Each col As DataGridViewColumn In columns
col_Statements =
New CodeStatementCollection
cmf =
New CodeMemberField(col.GetType(), col.Name)
cmf.Attributes = MemberAttributes.Assembly
Dim col_ObjectCreate As CodeObjectCreateExpression = New CodeObjectCreateExpression(col.GetType())
Dim col_Assign_Create As CodeAssignStatement = New CodeAssignStatement(New CodeVariableReferenceExpression(col.Name), col_ObjectCreate)
Dim col_Assign_DataPropertyName As CodeAssignStatement = New CodeAssignStatement(New CodeVariableReferenceExpression(col.Name + ".DataPropertyName"), New CodePrimitiveExpression(col.DataPropertyName))
Dim col_Assign_Name As CodeAssignStatement = New CodeAssignStatement(New CodeVariableReferenceExpression(col.Name + ".Name"), New CodePrimitiveExpression(col.Name))
Dim col_Assign_HeaderText As CodeAssignStatement = New CodeAssignStatement(New CodeVariableReferenceExpression(col.Name + ".HeaderText"), New CodePrimitiveExpression(col.HeaderText))
Dim col_Assign_ThreeState As CodeAssignStatement = New CodeAssignStatement(New CodeVariableReferenceExpression(col.Name + ".ThreeState"), New CodePrimitiveExpression(True))
If Me.GetExpression(manager, col) Is Nothing Then
cmfs.Add(cmf)
col_Statements.Add(col_Assign_Create)
col_Statements.Add(col_Assign_DataPropertyName)
col_Statements.Add(col_Assign_Name)
col_Statements.Add(col_Assign_HeaderText)
If TypeOf col Is DataGridViewCheckBoxColumn Then
col_Statements.Add(col_Assign_ThreeState)
End If
parameter_list.Add(
New CodeVariableReferenceExpression(col.Name))
End If
statements.AddRange(col_Statements)
i += 1
Next
Dim classcode As CodeTypeDeclaration = DirectCast(manager.GetService(GetType(CodeTypeDeclaration)), CodeTypeDeclaration)
If classcode IsNot Nothing Then
classcode.Members.AddRange(cmfs.ToArray)
End If
Dim target As CodeExpression = Me.GetExpression(manager, value)
If target IsNot Nothing And parameter_list.Count > 0 Then
createArray =
New CodeArrayCreateExpression(GetType(DataGridViewColumn), parameter_list.ToArray())
Dim colProp_Columns As CodePropertyReferenceExpression = New CodePropertyReferenceExpression(target, "Columns")
Dim colProp_AddRange As CodeMethodReferenceExpression = New CodeMethodReferenceExpression(colProp_Columns, "AddRange")
Dim col_Assign_Columns As CodeMethodInvokeExpression = New CodeMethodInvokeExpression(colProp_AddRange, createArray)
statements.Add(col_Assign_Columns)
Dim colPropExp As CodePropertyReferenceExpression = New CodePropertyReferenceExpression(target, "DataGridViewSource")
Dim col_Assign_DataGridViewSource As CodeAssignStatement = New CodeAssignStatement(colPropExp, New CodeVariableReferenceExpression(value.DataGridViewSource.Name))
statements.Add(col_Assign_DataGridViewSource)
End If
End If
End If
Return codeObject
End Function