У меня есть проект VB.NET в Visual Studio 2008, для которого я создал специализированное дополнение. Надстройка предлагает пользователю выбрать таблицу базы данных, берет файлы класса шаблона формы, копирует их в другой каталог в проекте и переименовывает класс формы в скопированных файлах. Затем он открывает новую форму и добавляет к ней элементы управления на основе полей в таблице базы данных.
Копирование формы шаблона приводит к тому, что фоновый компилятор выдает ошибки «дубликата элемента», например «Private Sub InitializeComponents (...) имеет несколько определений с одинаковыми сигнатурами», даже если я переименовал файлы новой формы и имя класса в них. Иногда эти ошибки исчезают до того, как открывается новая форма, но когда они остаются рядом, новая форма не открывается правильно, а вместо этого выдает ошибку.
Я реализовал некоторый код для ожидания, пока в списке ошибок не будет нулевых ошибок, прежде чем пытаться открыть новую форму. Иногда это помогло, но по какой-то причине иногда ошибки вообще не исчезают, пока надстройка не закрывается.
Я надеялся, что кто-нибудь сможет дать советы о том, как скопировать шаблон формы и переименовать копию, при этом фоновый компилятор никогда не заметит повторяющиеся элементы. Если это невозможно, возможно, у кого-то есть альтернатива?
Вот мой код, который копирует и переименовывает форму шаблона:
Private Sub CreateDataForm(ByVal tableName As String, ByVal displayName As String) ', ByVal subDataForms As IList(Of Object))
Try
Dim dataFormClassName As String = "frm" & MakeValidName(displayName)
Dim dataFormFileName As String = dataFormClassName & cVBSuffix
Dim templateFileName As String = DataFormTemplate.Name
Dim templateClassName As String = Replace(templateFileName, cVBSuffix, String.Empty)
'copy form template to data forms folder
'copy files associated with main projectitem
Dim newPItem As ProjectItem = Nothing
For i As Integer = 1 To DataFormTemplate.FileCount
newPItem = DataFormsFolder.ProjectItems.AddFromFileCopy(DataFormTemplate.FileNames(CShort(i)))
Next
'copy files associated with sub projectitems
For Each item As ProjectItem In DataFormTemplate.ProjectItems
For i As Integer = 1 To item.FileCount
DataFormsFolder.ProjectItems.AddFromFileCopy(item.FileNames(CShort(i)))
Next
Next
newPItem.Name = dataFormFileName
newPItem.ContainingProject.Save()
'fix class name for dataform template
FixDataFormClassName(DataFormTemplate, dataFormClassName, templateClassName)
newPItem.ContainingProject.Save()
Application.DoEvents()
'get table metadata
Dim lGetColumnInfo As DataColumnCollection = GetColumnInfo(tableName)
'add field controls
ConvertColumnInfoToFormControls(newPItem, lGetColumnInfo, tableName, displayName)
Catch ex As Exception
DisplayExceptionMessage(ex)
End Try
End Sub
Private Shared Sub FixDataFormClassName(ByVal pItem As ProjectItem, ByVal dataFormClassName As String, ByVal templateClassName As String)
If pItem.Document IsNot Nothing Then
pItem.Document.Close(vsSaveChanges.vsSaveChangesPrompt)
End If
For i As Integer = 1 To pItem.FileCount
Dim dftFile As New IO.FileInfo(pItem.FileNames(CShort(i)))
Dim tr As IO.TextReader = dftFile.OpenText() 'IO.FileMode.Open, IO.FileAccess.ReadWrite, IO.FileShare.None)
Dim sb As New Text.StringBuilder
Dim newData As String = tr.ReadToEnd().Replace(dataFormClassName, templateClassName)
tr.Close()
Dim sw As New IO.StreamWriter(dftFile.FullName)
sw.Write(newData)
sw.Close()
Next
If pItem.FileCodeModel IsNot Nothing Then CType(pItem.FileCodeModel, FileCodeModel2).Synchronize()
For Each item As ProjectItem In pItem.ProjectItems
FixDataFormClassName(item, dataFormClassName, templateClassName)
Next
End Sub