<?xml version="1.0" encoding="utf-16" standalone="yes"?>
<!--Created: 24.01.2019 14:57:53-->
<!--ACTOptimumVersion: 6.0.6901.26650-->
<AutoDataItems ACTOptimumVersion="6.0.6901.26650" Created="24.01.2019 14:57:53">
    <AutoDataControl Created="24.01.2019 14:57:53" ClassName="Melville_Schellmann.ACTOptimum3.Control.AutoData3.AutoData3" PrefClassVersion="1.0" ACTOptimumVersion="6.0.6901.26650">
        <Source>' #ScriptName: RestoreTabPageColumnsInDetailViews
    ' #Description: Setzt die Spalten in den Registerkartentabellen in der eine Detailansicht.
    ' #Copyright: © 2014-2019 by Melville-Schellmann
    ' #Author: Robert Schellmann, rs@melville-schellmann.de
    ' #Version: 1.2 (09.01.2019) Für alle Registerkarten in einer Detailansicht
    ' #Version: 1.0 (04.09.2014) s.o.

    ' AddReference("ACT.Shared.Windows.Forms")
    ' AddReference("ACT.UI.TabPage")
    
    ' Hier können die Spalten festgelegt werden, die angezeigt werden sollen

    ' In der Form: "&lt;Spaltenname1&gt;;&lt;Spaltenbreite1&gt;;&lt;Spaltenname2&gt;;&lt;Spaltenbreite2&gt;;...&lt;Spaltenname n&gt;;&lt;Spaltenbreite n&gt;"
    ' Spaltennamen mit einem !-Zeichen am Anfang bedeuten, dass es sich um einen internen Namen handelt und nicht um den angezeigteN Spaltennamen.
    
    Dim sColumnsContactList As String = "Kontakt;150;Firma;200;E-Mail;150;Stadt;200;Telefon;150"
    Dim sColumnsCompanyList As String = "Firma;200;PLZ;70;Stadt;200;Datensatzverwalter;150"
    Dim sColumnsGroupList As String = "Gruppenname;200;Datensatzverwalter;150"
    Dim sColumnsOpportunityList As String = "Name der Verkaufschance;300;Gesamt;100;Datensatzverwalter;150;Firma;200"
    Dim sColumnsActivityList As String = "!IsCleared;30;!TypeImage;34;!RecurringIcon;30;!OccurDate;82;!ListDisplayOccurTime;64;!PriorityName;76;!ListDisplayScheduledWith;143;!Regarding;514;!DetailsIcon;30;!HasAttachmentIcon;30;!IsPrivateIcon;30;!AssociatedWith;100"
    Dim sColumnsHistoryList As String = "!StartDate;71;!StartTime;51;!HistoryType;123;!RegardingAndDetails;235;!HasAttachmentIcon;30;!IsPrivateIcon;30;!ManageUserName;125;!AssociationSummary;125"
    Dim sColumnsNoteList As String = "!DisplayDate;100;!DisplayTime;34;!NoteText;508;!HasAttachmentIcon;30;!IsPrivateIcon;30;!ManageUserName;125;!AssociationSummary;125"
    Dim sColumnsSecondaryContactList As String = "Kontakt;200;Telefon;200"
    Dim sColumnsAssociationList As String = "!TBL_CONTACT.FULLNAME;200;!TBL_CONTACT.BUSINESS_PHONE;200;!TBL_CONTACT_CONTACT.CONTACT1ROLE;150;!TBL_CONTACT_CONTACT.DETAILS;100;!TBL_CONTACT_CONTACT.CONTACT2ROLE;100" 
    Dim sColumnsProductList As String = "Artikelnummer;140;Anzahl;80;Preis;80;Betrag;80;Beschreibung;200"
    ' Ab hier bitte keine Änderungen machen
    
    Dim oView As Object
    'Dim sViewName As String = "Act.UI.ContactViews.ContactDetailView"
    Dim sFieldNameACTTabControl As String = "Tabs"
    Dim oACTTab As Object 'Windows.Forms.TabControl
    Dim oACTTabPage As Object 'Windows.Forms.TabPage
    Dim sTabPageTitle As String
    Dim oACTGridTabPage As Act.UI.TabPage.GridTabPage
    Dim oColumnHelper As Object
    Dim oMemberInfo As System.Reflection.MemberInfo
    Dim oValue As Object = Nothing
    Dim i As Integer
    
    m_sScriptName = "RestoreTabPageColumnsInDetailViews"
    m_oACTApp = ACTApp
    m_oAutoData = AutoData
    m_oError = New ErrorHandling.BaseErrorMessage
    
    ' Ist der aktuelle View der richtige?
    oView = m_oACTApp.CurrentView
    '    If String.Compare(oView.GetType.ToString, sViewName, True) &lt;&gt; 0 Then
    '      m_oError.SetError("Das Script ist für die Detailansicht '{0}' und nicht für die aktuelle Ansicht '{0}' konfiguriert.", sViewName, oView.GetType.ToString)
    '      GoTo Abbruch
    '    End If    
    
    If Not TryToGetMemberFromObject(oView, sFieldNameACTTabControl, Reflection.MemberTypes.Field, Nothing, oMemberInfo, oValue) Then
      GoTo Abbruch
    End If
    Try
      oACTTab = CType(oValue, System.Windows.Forms.TabControl)
    Catch ex As Exception
      m_oError.Seterror(ex, "Beim Ermitteln des TabControls ist ein Fehler aufgetreten.")
      GoTo Abbruch
    End Try
   
    Try
      oACTTabPage = oACTTab.SelectedACTTab
    Catch ex As Exception
      m_oError.Seterror(ex, "Beim Ermitteln der aktuellen TabPage ist ein Fehler aufgetreten.")
      GoTo Abbruch
    End Try
   
    If oACTTabPage Is Nothing Then
      m_oError.SetError("In der aktuellen Ansicht ist keine Tabellen-Registerkarte ausgewählt.")
      GoTo Abbruch
    End If
    Try
      sTabPageTitle = CType(oACTTabPage, system.windows.Forms.tabpage).text
    Catch ex As Exception
      m_oError.Seterror(ex, "Beim Ermitteln des Titles von der TabPage ist ein Fehler aufgetreten.")
      GoTo Abbruch
    End Try

    If oACTTabPage.Controls.Count = 0 Then
      m_oError.SetError("In der aktuellen Ansicht ist keine Tabellen-Registerkarte ausgewählt.")
      GoTo Abbruch
    End If
    
    For i = 0 To oACTTabPage.Controls.count - 1
      oACTGridTabPage = oACTTabPage.Controls(i)
      Select Case oACTGridTabPage.GetType().ToString
        Case "Act.UI.Companies.Views.ContactsTabPage","Act.UI.Groups.Views.ContactsTabPage","Act.UI.OpportunityView.ContactsTabPage"
          If TrySetColumns(sColumnsContactList, oACTGridTabPage, sTabPageTitle) = False Then
            GoTo Abbruch
          End If
        Case "Act.UI.ContactViews.CompaniesTabPage","Act.UI.OpportunityView.CompaniesTabPage"
          If TrySetColumns(sColumnsCompanyList, oACTGridTabPage, sTabPageTitle) = False Then
            GoTo Abbruch
          End If
        Case "Act.UI.ContactViews.GroupsTabPage","Act.UI.OpportunityView.GroupsTabPage"
          If TrySetColumns(sColumnsGroupList, oACTGridTabPage, sTabPageTitle) = False Then
            GoTo Abbruch
          End If
        Case "Act.UI.ContactViews.ContactOpportunityPage","Act.UI.Companies.Views.CompanyOpportunityPage","Act.UI.Groups.Views.GroupOpportunityPage"
          If TrySetOpportunityColumns(sColumnsOpportunityList, oACTGridTabPage) = False Then
            GoTo Abbruch
          End If
        Case "Act.UI.ContactViews.ContactActivitiesTabPage","Act.UI.Companies.Views.CompanyActivitiesTabPage","Act.UI.Groups.Views.GroupActivitiesTabPage","Act.UI.OpportunityView.OpportunityActivitiesTabPage"
          If TrySetColumns(sColumnsActivityList, oACTGridTabPage, sTabPageTitle) = False Then
            GoTo Abbruch
          End If
        Case "Act.UI.TabPage.AggregateEntityHistoryTabPage", "Act.UI.TabPage.HistoryTabPage"
          If TrySetColumns(sColumnsHistoryList, oACTGridTabPage, sTabPageTitle) = False Then 
            GoTo Abbruch
          End If
        Case "Act.UI.TabPage.AggregateEntityNotesTabPage", "Act.UI.TabPage.NotesTabPage"
          If TrySetColumns(sColumnsNoteList, oACTGridTabPage, sTabPageTitle) = False Then
            GoTo Abbruch
          End If
        Case "Act.UI.ContactViews.SecondaryContactsGridTabPage"
          If TrySetColumns(sColumnsSecondaryContactList, oACTGridTabPage, sTabPageTitle) = False Then
            GoTo Abbruch
          End If
        Case "Act.UI.TabPage.AssociationGridTabPage"
          If TrySetColumns(sColumnsAssociationList, oACTGridTabPage, sTabPageTitle) = False Then
            GoTo Abbruch
          End If
        Case "Act.UI.OpportunityView.ProductsTabPage"
          If TrySetColumns(sColumnsProductList, oACTGridTabPage, sTabPageTitle) = False Then
            GoTo Abbruch
          End If        
        Case Else
          m_oError.SetError("In der aktuellen Ansicht ist eine nicht unterstützte Registerkarte vom Typ '{0}' ausgewählt.", oACTGridTabPage.GetType().ToString)
          GoTo Abbruch
      End Select
    Next
    Abbruch:
    If m_oError.HasAnError Then
      m_oError.ShowError(MsgBoxStyle.Exclamation, m_sScriptName)
    End If
    Return String.Empty
  End Function
  
  ' Objekte die in allen Funkionen verwendet werden können.
  Private Shared m_oACTApp As  Act.UI.ActApplication
  Private Shared m_oAutoData As Melville_Schellmann.ACTOptimum3.Control.AutoData3.AutoDataScript
  Private Shared m_sScriptName As String
  Private Shared m_oError As ErrorHandling.BaseErrorMessage
  
  Private Shared Function TrySetColumns(sColumnsNameAndWidth As String, oACTTabPage As Act.UI.TabPage.GridTabPage, sTabPageTitle As String)As Boolean 
    Return TrySetColumns(sColumnsNameAndWidth, oACTTabPage, sTabPageTitle, Nothing) 
  End Function
  Private Shared Function TrySetColumns(sColumnsNameAndWidth As String, oACTTabPage As Act.UI.TabPage.GridTabPage, sTabPageTitle As String, aFieldDescriptor() As Act.Framework.ComponentModel.DBFieldDescriptor)As Boolean 

    Dim oTabPage As Control
    Dim aColumnNameWidth() As String
    Dim sFieldNameFlexGridColumnHelper As String = "gridColumnHelper"
    Dim oColumnHelper As System.ComponentModel.Component
    Dim sFieldNameAllColumns  As String = "allColumns"
    Dim oFieldDescriptor As  Act.Framework.ComponentModel.DBFieldDescriptor'Act.Framework.MutableEntities.MutableEntityFieldDescriptor
    Dim sRealFieldName As String = String.Empty
    Dim lColumWidth As Integer
    Dim oColumnInfoList As System.Collections.ArrayList
    Dim aColumnInfo As Object 'Act.Shared.windows.forms.FlexGridColumnHelper.ColumnInfo
    Dim oColumnInfo As Act.Shared.windows.forms.FlexGridColumnHelper.ColumnInfo
    Dim aAllColumn() As Act.Shared.windows.forms.FlexGridColumnHelper.ColumnInfo = Nothing 'Act.Shared.windows.forms.FlexGridColumnHelper.ColumnInfo
    Dim sAssemblyACTSharedWindowsForms As String = "Act.Shared.Windows.Forms"
    Dim sMethodNameLoadGridItems As String = "LoadGridItems"
    Dim sMethodNameSet_CurrentColumns As String = "set_CurrentColumns"

    Dim oMethod As Reflection.MethodInfo
    Dim oTypeColumnInfo As System.Type
    Dim lIndexWantedColumn As Integer
    Dim lIndexAllColumn As Integer
    Dim lIndexFieldDescriptor As Integer
    Dim bIsColumnNameRealName As Boolean
    Dim bFieldExist As Boolean
    Dim bColumnExist As Boolean
    Dim aParameter(0) As Object

    Dim oValue As Object = Nothing
    Dim oMemberInfo As System.Reflection.MemberInfo = Nothing
    

    TrySetColumns = False
    
    ' Type "Act.Shared.Windows.Forms.FlexGridColumnHelper+ColumnInfo" aus der Assembly "Act.Shared.Windows.Forms" nachladen
    If tryGetTypeFromAssemly("Act.Shared.Windows.Forms.dll", "Act.Shared.Windows.Forms.FlexGridColumnHelper+ColumnInfo", oTypeColumnInfo) = False Then
      GoTo Abbruch
    End If

    ' oContactTabPage ermitteln
    oTabPage = oACTTabPage
    
    ' oColumnHelper aus oContactTabPage ermitteln
    If Not TryToGetMemberFromObject(oTabPage, sFieldNameFlexGridColumnHelper, Reflection.MemberTypes.Field, Nothing, oMemberInfo, oValue) Then
      GoTo Abbruch
    End If
    If oValue Is Nothing Then
      m_oError.SetError("In der Registerkarte '{0}' konnte kein {1} gefunden werden.", sTabPageTitle, sFieldNameFlexGridColumnHelper)
      GoTo Abbruch
    End If 
    oColumnHelper = CType(oValue, System.ComponentModel.Component)
   
    ' Array AllColumns aus oColumnHelper ermitteln
    If Not TryToGetMemberFromObject(oColumnHelper, sFieldNameAllColumns, Reflection.MemberTypes.Field, Nothing, oMemberInfo, oValue) Then
      m_oError.SetError("In der Registerkarte '{0}' konnte keine Liste aller Spalten gefunden werden.", sTabPageTitle)
      GoTo Abbruch
    End If
    aAllColumn = CType(oValue, Act.[Shared].Windows.Forms.FlexGridColumnHelper.ColumnInfo())
    
    ' Wenn kein Array von FieldDescriptoren übergeben wurde, dann werden die gridColumnHelper.AllColumns verwendet
    If  aFieldDescriptor Is Nothing Then
      ReDim aFieldDescriptor(aAllColumn.Length - 1)
      For lIndexAllColumn = 0 To aAllColumn.Length - 1
        aFieldDescriptor(lIndexAllColumn) = aAllColumn(lIndexAllColumn).descriptor
      Next
    End If

    ' Feldernamen und Breiten splitten und in einen Array speichern
    aColumnNameWidth = sColumnsNameAndWidth.Split(";".ToCharArray, StringSplitOptions.RemoveEmptyEntries)
    If aColumnNameWidth.Length = 0 Then
      m_oError.SetError("Für die Registerkarte '{0}' wurden keine Spaltennamen hinterlegt.", sTabPageTitle)
      GoTo Abbruch
    End If

    oColumnInfoList = New System.Collections.ArrayList  
    oColumnInfoList.Clear
    Dim sFieldDisplayNames As String 
    
    For lIndexWantedColumn = 0 To aColumnNameWidth.Length - 2 Step 2
      bFieldExist = False
      bIsColumnNameRealName = aColumnNameWidth(lIndexWantedColumn).IndexOf("!"c) = 0
      If bIsColumnNameRealName And aColumnNameWidth(lIndexWantedColumn).Length = 1 Then
        m_oError.SetError("Es wurde ein falscher Spaltenname '{0}' für die Registerkarte '{1}' angegeben.", aColumnNameWidth(lIndexWantedColumn), sTabPageTitle)
        GoTo Abbruch
      End If
      sFieldDisplayNames = String.empty
      For lIndexFieldDescriptor = 0  To aFieldDescriptor.Length - 1
        oFieldDescriptor = aFieldDescriptor(lIndexFieldDescriptor)
        sFieldDisplayNames &amp;= oFieldDescriptor.Name &amp; vbtab &amp; oFieldDescriptor.DisplayName &amp; vbcrlf
        If  (bIsColumnNameRealName And String.Compare(aColumnNameWidth(lIndexWantedColumn).Substring(1), oFieldDescriptor.Name, True) = 0) Or _
          (String.Compare(aColumnNameWidth(lIndexWantedColumn), oFieldDescriptor.DisplayName, True) = 0) Then        
          bFieldExist = True
          sRealFieldName = oFieldDescriptor.Name
          If Integer.TryParse(aColumnNameWidth(lIndexWantedColumn + 1), lColumWidth) Then
            If lColumWidth &lt; 0 Or lColumWidth &gt; 400 Then
              lColumWidth = 100
            End If
          Else
            lColumWidth = 100
          End If
          Exit For
        End If
      Next
      If bFieldExist = False Then
        m_oError.SetError("Die angegebene Spalte '{0}' wurde nicht bei den möglichen Spalten gefunden.", aColumnNameWidth(lIndexWantedColumn))
        ' Weiter machen!
      Else
        bColumnExist = False
        For lIndexAllColumn = 0 To aAllColumn.Length - 1
          oColumnInfo = aAllColumn(lIndexAllColumn)
          If String.Compare(sRealFieldName, oColumnInfo.propertyName, True) = 0 Then
            bColumnExist = True
            ' Spaltenbreite setzen
            oColumnInfo.colWidth = lColumWidth
            ' Spalte in die ArrayList übernehmen
            oColumnInfo.index = lIndexAllColumn
            oColumnInfoList.Add(oColumnInfo)
            Exit For
          End If
        Next

        If bColumnExist = False Then
          m_oError.SetError("Das angegebene Feld '{0}' wurde nicht bei den Spalten gefunden.", sRealFieldName)
        End If
      End If 
    Next
   
    If oColumnInfoList.Count = 0 Then
      m_oError.seterror("Für die Registerkarte '{0}' wurde keine der hinterlegten Spalten gefunden.", sTabPageTitle)
      GoTo Abbruch
    End If
    
    ' Array vom Typ Act.Shared.windows.forms.FlexGridColumnHelper.ColumnInfo erstellen
    aColumnInfo = System.Array.CreateInstance(oTypeColumnInfo, oColumnInfoList.Count)
    
    For lIndexWantedColumn = 0 To oColumnInfoList.Count - 1
      aColumnInfo(lIndexWantedColumn) = oColumnInfoList.item(lIndexWantedColumn)
    Next
    
    oMethod = oColumnHelper.GetType.GetMethod(sMethodNameSet_CurrentColumns, Reflection.BindingFlags.CreateInstance Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Public)
    If oMethod Is Nothing Then
      m_oError.SetError("Die Methode '{0}' wurde nicht gefunden.", sMethodNameSet_CurrentColumns)
      GoTo Abbruch
    End If
    aParameter(0) = aColumnInfo
    Try
      oMethod.Invoke(oColumnHelper, aParameter)  
    Catch ex As Exception
      m_oError.SetError(ex, "Es ist ein Fehler beim Setzen der Spalten aufgetreten.")
      GoTo Abbruch
    End Try
    
    ' Methode LoadGridItems ausführen, damit die Tabelle neu aufgebaut wird.
    If oTabPage.GetType.ToString = "Act.UI.OpportunityView.ProductsTabPage" Then

      Dim oCustomFieldList As System.Collections.Generic.list(Of Act.Framework.CustomEntities.CustomEntityFieldDescriptor)
      Dim sCustomFieldList As System.Text.StringBuilder
      Dim oProductForm As System.Windows.Forms.Form
      Dim sUserSetting As String = "PRODUCT_TAB_COLUMNS"
      Dim sSettingValue As String = ""

      ' Liste der CustomEntitiyFieldDescriptors aus der oColumnInfoList erstellen
      ' und ein String für die UserSetting aus den real Feldnamen erstellen
      oCustomFieldList = New System.Collections.Generic.list(Of act.Framework.CustomEntities.CustomEntityFieldDescriptor)
      sCustomFieldList = New System.Text.StringBuilder
      For lIndexFieldDescriptor = 0 To oColumnInfoList.Count - 1
        If lIndexFieldDescriptor &gt; 0 Then
          sCustomFieldList.Append(",")
        End If
        oColumnInfo = oColumnInfoList.item(lIndexFieldDescriptor)
        oCustomFieldList.add(oColumnInfo.descriptor)
        sCustomFieldList.Append(oColumnInfo.descriptor.Name)
      Next

      ' Wenn das productForm existiert werden dort auch die Felder gesetzt
      If TryToGetMemberFromObject(oTabPage, "productForm", system.Reflection.MemberTypes.Field, GetType(System.Windows.Forms.Form), oMemberInfo, oValue) = False Then
        GoTo Abbruch
      End If
      If Not oValue Is Nothing Then
        oProductForm = CType(ovalue, System.Windows.Forms.Form)
        If TryToGetMemberFromObject(oProductForm, "productFields", system.Reflection.MemberTypes.Field, GetType(Act.Framework.CustomEntities.CustomEntityFieldDescriptor()), oMemberInfo, oValue) = False Then
          GoTo Abbruch
        End If
        CType(oMemberInfo, System.Reflection.Fieldinfo).SetValue(oProductForm, oCustomFieldList.toarray)
      End If
      ' Liste der real Feldnamen in UserSetting "PRODUCT_TAB_COLUMNS" speichern
      If TrySetUserSetting(m_oACTApp.ActFramework.UserSettings, sUserSetting, sCustomFieldList.ToString, m_oACTApp.ActFramework.CurrentUser) = False Then
        m_oError.SetError("Es konnte nicht die Benutzereinstellung '{0}' gesetzt werden.", sUserSetting)
      End If
    End If
    
    
    oMethod = oTabPage.GetType.GetMethod(sMethodNameLoadGridItems, Reflection.BindingFlags.CreateInstance Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Public)
    If oMethod Is Nothing Then
      m_oError.SetError("Die Methode '{0}' wurde nicht gefunden.", sMethodNameLoadGridItems)
      GoTo Abbruch
    End If
    oMethod.Invoke(oTabPage, Nothing)
    
    TrySetColumns = True
    
    Abbruch:

  End Function
  Private Shared Function TrySetUserSetting(ByVal oUserSettings As Act.Framework.UserSettings.UserSettingsManager, ByVal sSettingName As String, ByVal sSettingValue As String, ByVal oUser As Act.Framework.Users.User)As Boolean
    'Friend Sub UpdateUserSetting(ByVal settingName As String, ByVal settingValue As String, ByVal user As User)

    Dim oMethod As System.Reflection.MethodInfo
    Dim sMethodName As String = "UpdateUserSetting"
    
    TrySetUserSetting = False
    
    oMethod = oUserSettings.GetType.GetMethod(sMethodName, Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.CreateInstance)
    If oMethod Is Nothing Then
      m_oError.SetError("Es konnte nicht die Methode '{0}' gefunden werden.", sMethodName)
      GoTo Abbruch
    End If
    Try
      oMethod.Invoke(oUserSettings, New Object() {sSettingName, sSettingValue, oUser})
    Catch ex As Exception
      m_oError.SetError("Es ist ein Fehler beim Ausführen der Methode '{0}' aufgetreten.", sMethodName)
      GoTo Abbruch
    End Try
    TrySetUserSetting = True
    
    Abbruch:

  End Function
  Private Shared Function TrySetOpportunityColumns(sColumnsNameAndWidth As String, oACTTabPage As Act.UI.TabPage.MutableEntityGridTabPage) As Boolean
    
    Dim oTabPage As Control
    Dim aColumnNameWidth() As String
    Dim sFieldNameStriker As String = "striker"
    Dim sFieldNameOppColumnsHelper As String = "columnsHelper"
    Dim sFieldNameGridControl As String = "theGrid"
    Dim sFieldNameFieldNames As String = "fieldNames"
    Dim sFieldNameColumnSizes As String = "columnSizes"
    Dim sFieldNameDisplayFields As String = "displayFields"
    Dim sFieldNamePropertyColumns As String = "propertyColumns"
    Dim sFieldNameDisplayOpportunityFields As String = "displayOpportunityFields"
    
    
    Dim sMethodNameGetStickyColumnsPreference As String = "GetStickyColumnsPreference"
    Dim sMethodNameGetStickyWidthsPreference As String = "GetStickyWidthsPreference"
    Dim oOpportunityTabStriker As Act.UI.Opportunities.OpportunityTabStriker
    Dim oOppColumnHelper As Object = Nothing
    Dim oGridControl As Object = Nothing
    Dim oFieldNames As System.Collections.Generic.List(Of String) = Nothing
    Dim oColumnSizes As System.Collections.Generic.List(Of Integer) = Nothing
    Dim oDisplayFields() As Act.Framework.MutableEntities.MutableEntityFieldDescriptor = Nothing
    Dim oPropertyColumns() As System.ComponentModel.PropertyDescriptor = Nothing
    Dim oDisplayOpportunityFields() As Act.Framework.MutableEntities.MutableEntityFieldDescriptor = Nothing
    
    Dim sRealFieldName As String = String.Empty
    Dim lColumWidth As Integer
    Dim oFieldDescriptor As  Act.Framework.MutableEntities.MutableEntityFieldDescriptor = Nothing
    Dim oValidatedFieldDescriptor As  Act.Framework.MutableEntities.MutableEntityFieldDescriptor
    Dim oOppManager As Act.Framework.Opportunities.OpportunityManager
    
    Dim oColumnNameList As System.Collections.Generic.List(Of String)
    Dim oColumnSizeList As System.Collections.Generic.List(Of Integer)
    Dim oFieldDescriptorList As System.Collections.Generic.List(Of Act.Framework.MutableEntities.MutableEntityFieldDescriptor)
    Dim oFieldDescriptors As Act.Shared.Collections.DataList.DataDescriptorCollection
    
    Dim oMethod As Reflection.MethodInfo
    Dim lIndexWantedColumn As Integer
    Dim lIndexFieldDescriptor As Integer
    Dim bFieldExist As Boolean
    Dim bIsColumnNameRealName As Boolean
    Dim aParameter(0) As Object
    Dim sPrefsName As String

    TrySetOpportunityColumns = False
    
    Dim oValue As Object = Nothing
    Dim oMemberInfo As System.Reflection.MemberInfo = Nothing
    Dim oFieldInfo As System.Reflection.FieldInfo = Nothing
    
    ' oOpportunityTabPage ermitteln
    oTabPage = oACTTabPage
    
    ' oOpportunityTabStriker aus oAggregateEnitityOpportunityPage ermitteln
    If Not TryToGetMemberFromObject(oTabPage, sFieldNameStriker, Reflection.MemberTypes.Field, Nothing, oMemberInfo, oValue) Then
      GoTo Abbruch
    End If
    oOpportunityTabStriker = CType(oValue, Act.UI.Opportunities.OpportunityTabStriker)

    ' oOppColumnHelper aus oAggregateEnitityOpportunityPage ermitteln
    If Not TryToGetMemberFromObject(oOpportunityTabStriker, sFieldNameOppColumnsHelper, Reflection.MemberTypes.Field, Nothing, oMemberInfo, oOppColumnHelper) Then
      GoTo Abbruch
    End If
    
    ' oGridControl aus oACTTabPage ermitteln
    If Not TryToGetMemberFromObject(oTabPage, sFieldNameGridControl, Reflection.MemberTypes.Field, Nothing, oMemberInfo, oGridControl) Then
      GoTo Abbruch                                                                                                                          
    End If
    oGridControl.Refresh

    ' Feldernamen und Breiten splitten und in einen Array speichern
    aColumnNameWidth = sColumnsNameAndWidth.Split(";".ToCharArray, StringSplitOptions.RemoveEmptyEntries)
    If aColumnNameWidth.Length = 0 Then
      m_oError.SetError("Es wurden keine Spaltennamen im Script '{0}' hinterlegt.", m_sScriptName)
      GoTo Abbruch
    End If
    
    oColumnNameList = New System.Collections.Generic.List(Of String)
    
    oColumnSizeList = New System.Collections.Generic.List(Of Integer)
    
    oFieldDescriptorList = New System.Collections.Generic.List(Of Act.Framework.MutableEntities.MutableEntityFieldDescriptor)
    
    
    oOppManager = m_oACTApp.ActFramework.Opportunities
    oFieldDescriptors = DirectCast(oGridControl.DataSource, Act.Framework.MutableEntities.MutableEntityList).FieldDescriptors '  oOppColumnHelper.EntityList.FieldDescriptors 
    oFieldDescriptors.BeginEdit
    oFieldDescriptors.Clear
    oColumnSizeList.Clear
    oColumnNameList.Clear
    
    For lIndexWantedColumn = 0 To aColumnNameWidth.Length - 2 Step 2
      bFieldExist = False
      bIsColumnNameRealName = aColumnNameWidth(lIndexWantedColumn).IndexOf("!"c) = 0
      For Each oFieldDescriptor In  m_oACTApp.ActFramework.Opportunities.GetMutableEntityFieldDescriptors
        If (bIsColumnNameRealName And String.Compare(aColumnNameWidth(lIndexWantedColumn).Substring(1), oFieldDescriptor.Name, True) = 0) Or _
          (String.Compare(aColumnNameWidth(lIndexWantedColumn), oFieldDescriptor.DisplayName, True) = 0) Then
          bFieldExist = True
          sRealFieldName = oFieldDescriptor.Name
          If Integer.TryParse(aColumnNameWidth(lIndexWantedColumn + 1), lColumWidth) Then
            If lColumWidth &lt; 0 Or lColumWidth &gt; 400 Then
              lColumWidth = 100
            End If
          Else
            lColumWidth = 100
          End If
          Exit For
        End If
      Next
      If bFieldExist = False Then
        m_oError.SetError("Die angegebene Spalte '{0}' wurde nicht bei den möglichen Spalten gefunden.", aColumnNameWidth(lIndexWantedColumn))
      Else
        ' Restliche Überprüfungen aus der Methode CustimizeColumns vom OppColumnsHelper
        Select Case sRealFieldName
          Case "TBL_OPPORTUNITY.ISPRIVATE"
            oValidatedFieldDescriptor = oOppManager.GetPrivateFieldDescriptor 'OppColumnHelper.AddImage(oOppManager.GetPrivateFieldDescriptor)
            Exit Select
          Case "TBL_OPPORTUNITY.ACTUALCLOSEDATE", "TBL_OPPORTUNITY.EDITDATE"
            oValidatedFieldDescriptor = oFieldDescriptor
            Exit Select
          Case "TBL_OPPORTUNITY.MANAGERUSERNAME"
            oValidatedFieldDescriptor = oOppManager.GetRecordManagerFieldDescriptor
            Exit Select
          Case "TBL_OPPORTUNITY.CREATEUSERNAME"
            oValidatedFieldDescriptor = oOppManager.GetRecordCreatorFieldDescriptor
            Exit Select
          Case "TBL_OPPORTUNITY.EDITUSERNAME"
            oValidatedFieldDescriptor = oOppManager.GetRecordLastEditorFieldDescriptor
            Exit Select
          Case "TBL_OPPORTUNITY.PROBABILITYPCT"
            oValidatedFieldDescriptor = oOppManager.GetProbablityFieldDescriptor
            Exit Select
          Case "TBL_OPPORTUNITY.STATUSNUM"
            oValidatedFieldDescriptor = oOppManager.GetStatusFieldDescriptor
            Exit Select
          Case Else
            oValidatedFieldDescriptor = oFieldDescriptor
            Exit Select
        End Select
        oColumnSizeList.Add(lColumWidth)
        oColumnNameList.Add(sRealFieldName)
        oFieldDescriptorList.Add(oValidatedFieldDescriptor)
        oFieldDescriptors.Add(oValidatedFieldDescriptor)
      End If 
    Next
    
    ' oOppColumnHelper.displayFields = oFieldDescriptorList.ToArray
    If Not TryToGetMemberFromObject(oOppColumnHelper, sFieldNameDisplayFields, Reflection.MemberTypes.Field, GetType(act.Framework.MutableEntities.MutableEntityFieldDescriptor()), oFieldInfo, oDisplayFields) Then
      GoTo Abbruch
    End If
    oFieldInfo.SetValue(oOppColumnHelper, oFieldDescriptorList.ToArray)

    oFieldDescriptors.EndEdit

    If oColumnSizeList.Count = 0 Then
      m_oError.SetError("Es wurde keine Spalte gefunden.")
      GoTo Abbruch
    End If
    
    oOppColumnHelper.FixupFieldFormatting

    Dim aDisplayFieldList() As Act.Framework.MutableEntities.MutableEntityFieldDescriptor
    Dim aColumnSizes() As System.Int32
    Dim aFieldNames() As String
    Dim i As Integer
    
    aDisplayFieldList = New Act.Framework.MutableEntities.MutableEntityFieldDescriptor(oFieldDescriptors.Count - 1) {}
    aColumnSizes = New System.Int32(oFieldDescriptors.Count - 1){}
    aFieldNames = New System.String(oFieldDescriptors.Count - 1){}

    For i = 0 To aDisplayFieldList.Length - 1
      aDisplayFieldList(i) = oFieldDescriptors.item(i)
      aColumnSizes(i) = oColumnSizeList.item(i)
      aFieldNames(i) = oColumnNameList.item(i)
    Next
    
    ' oOppColumnHelper.fieldNames = oColumnNameList
    If Not TryToGetMemberFromObject(oOppColumnHelper, sFieldNameFieldNames, Reflection.MemberTypes.Field, oColumnNameList.GetType, oFieldInfo, oValue) Then
      GoTo Abbruch                                                                                                                          
    End If
    oFieldInfo.SetValue(oOppColumnHelper, oColumnNameList)
    
    ' oOppColumnHelper.columnSizes =  oColumnSizeList
    If Not TryToGetMemberFromObject(oOppColumnHelper, sFieldNameColumnSizes, Reflection.MemberTypes.Field, oColumnSizeList.GetType, oFieldInfo, oValue) Then
      GoTo Abbruch                                                                                                                          
    End If
    oFieldInfo.SetValue(oOppColumnHelper, oColumnSizeList)    
    
    oOppColumnHelper.SetColumnSizes
    oGridControl.Refresh
    
    ' Im OpportunityTabStriker.OnCustomizeColumns()
    
    ' displayOpportunityFields aus oOpportunityTabStriker ermitteln
    If Not TryToGetMemberFromObject(oOpportunityTabStriker, sFieldNameDisplayOpportunityFields, Reflection.MemberTypes.Field, GetType(act.Framework.MutableEntities.MutableEntityFieldDescriptor()), oFieldInfo, oValue) Then
      GoTo Abbruch
    End If
    
    oFieldInfo.SetValue(oOpportunityTabStriker, aDisplayFieldList)
    
    ' Methode GetStickyColumnsPreference ausführen um den PrefString zu bekommen
    oMethod = oOpportunityTabStriker.GetType.GetMethod(sMethodNameGetStickyColumnsPreference, Reflection.BindingFlags.CreateInstance Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Public)
    If oMethod Is Nothing Then
      m_oError.SetError("Die Methode '{0}' wurde nicht gefunden.", sMethodNameGetStickyColumnsPreference)
      GoTo Abbruch
    End If
    sPrefsName = oMethod.Invoke(oOpportunityTabStriker, Nothing)
    m_oACTApp.ActFramework.Preferences.UserPreferences.SetObjectValue(sPrefsName, oOppColumnHelper.FieldNames)
        
    ' Methode GetStickyWidthsPreference ausführen um den PrefString zu bekommen
    oMethod = oOpportunityTabStriker.GetType.GetMethod(sMethodNameGetStickyWidthsPreference, Reflection.BindingFlags.CreateInstance Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Public)
    If oMethod Is Nothing Then
      m_oError.SetError("Die Methode '{0}' wurde nicht gefunden.", sMethodNameGetStickyWidthsPreference)
      GoTo Abbruch
    End If
    sPrefsName = oMethod.Invoke(oOpportunityTabStriker, Nothing)
    m_oACTApp.ActFramework.Preferences.UserPreferences.SetObjectValue(sPrefsName, oOppColumnHelper.ColumnSizes) 
    
    
    TrySetOpportunityColumns = True
 
    Abbruch:

  End Function
  Shared Function TryGetTypeFromAssemly(sAssemblyFileName As String, sTypeFullName As String, ByRef oReturnType As System.Type) As Boolean
   
    Dim oAssembly As System.Reflection.Assembly
    Dim oType As System.Type = Nothing
    Dim typeMember As System.Type
    
    TryGetTypeFromAssemly = False
    
    oReturnType = Nothing
    If System.IO.File.Exists(CStr(microsoft.Win32.Registry.LocalMachine.OpenSubKey("Software\Act\Install").GetValue("InstallPath")) &amp; sAssemblyFileName) Then
      oAssembly = System.Reflection.Assembly.LoadFrom(CStr(microsoft.Win32.Registry.LocalMachine.OpenSubKey("Software\Act\Install").GetValue("InstallPath")) &amp; sAssemblyFileName)
    Else
      oAssembly = System.Reflection.Assembly.LoadFrom(sAssemblyFileName)
    End If
    
    If oAssembly Is Nothing Then
      m_oError.SetError("Es konnte nicht die Assembly '{0}' geladen werden.", sAssemblyFileName)
      GoTo Abbruch
    End If
    For Each oType In oAssembly.GetExportedTypes
      If String.Compare(sTypeFullName, oType.FullName, True) = 0 Then
        oReturnType = oType
        Exit For
      End If
    Next
    If oReturnType Is Nothing Then
      m_oError.SetError("Es konnte nicht der Type '{0}' in der Assembly '{0}' gefunden werden.", sTypeFullName, sAssemblyFileName)   
      GoTo Abbruch
    End If

    TryGetTypeFromAssemly = True
    
    Abbruch:
  End Function

  Shared Function TryToGetMemberFromObject(ByVal oObject As Object, ByVal sMemberName As String, ByVal oMemberType As System.Reflection.MemberTypes, ByVal oReturnType As System.Type, ByRef oReturnMember As System.Reflection.MemberInfo, ByRef oReturnValue As Object) As Boolean
    Dim aMember() As System.Reflection.MemberInfo
    Dim oValue As Object

    Dim oCurrentType As Type
    Dim bMemberFound As Boolean
    Dim oProp As System.Reflection.PropertyInfo
    Dim oField As System.Reflection.FieldInfo
    
    
    TryToGetMemberFromObject = False
    
    oCurrentType = oObject.GetType
 
    While Not oCurrentType Is GetType(System.Object)
      ' Try
      aMember = oCurrentType.GetMember(sMemberName, oMemberType, Reflection.BindingFlags.CreateInstance Or Reflection.BindingFlags.Instance Or Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Public)
      oReturnValue = Nothing
      Select Case aMember.Length
        Case 0
        ' Nicht gefunden, nichts machen
        Case 1
          Select Case aMember(0).MemberType
            Case Reflection.MemberTypes.Property
              oProp = CType(aMember(0), System.Reflection.PropertyInfo)
              oValue = oProp.GetValue(oObject, Nothing)
              If oReturnType Is Nothing Then
                oReturnValue = oValue
                oReturnMember = aMember(0)
                bMemberFound = True
                Exit While
              Else
                If oReturnType.IsInterface Then
                  If New ArrayList(oValue.GetType.GetInterfaces).Contains(oReturnType) = False Then
                    m_oError.SetError("Der Type von der Property '{0}' ist '{1}' und nicht wie gewünscht '{2}'.", sMemberName, oProp.PropertyType.ToString, oReturnType.ToString)
                    GoTo Abbruch
                  End If
                  oReturnValue = oValue
                  oReturnMember = aMember(0)
                  bMemberFound = True
                  Exit While
                Else
                  If Not oReturnType.IsAssignableFrom(oProp.PropertyType)  Then
                    m_oError.SetError("Der Type von der Property '{0}' ist '{1}' und nicht wie gewünscht '{2}'.", sMemberName, oProp.PropertyType.ToString, oReturnType.ToString)
                    GoTo Abbruch
                  End If
                  oReturnValue = oValue
                  oReturnMember = aMember(0)
                  bMemberFound = True
                  Exit While
                End If
              End If
            Case Reflection.MemberTypes.Field
              oField = CType(aMember(0), System.Reflection.FieldInfo)
              oValue = oField.GetValue(oObject)
              If oReturnType Is Nothing Then
                oReturnValue = oValue
                oReturnMember = aMember(0)
                bMemberFound = True
                Exit While
              Else
                If oReturnType.IsInterface Then
                  If New ArrayList(oField.FieldType.GetInterfaces).Contains(oReturnType) = False Then
                    m_oError.SetError("Der Type vom Field '{0}' ist '{1}' und nicht wie gewünscht '{2}'.", sMemberName, oField.FieldType.ToString, oReturnType.ToString)
                    GoTo Abbruch
                  End If
                  oReturnValue = oValue
                  oReturnMember = aMember(0)
                  bMemberFound = True
                  Exit While
                Else
                  If Not oReturnType.IsAssignableFrom(oField.FieldType)  Then
                    m_oError.SetError("Der Type vom Field '{0}' ist '{1}' und nicht wie gewünscht '{2}'.", sMemberName, oField.FieldType.ToString, oReturnType.ToString)
                    GoTo Abbruch
                  End If
                  oReturnValue = oValue
                  oReturnMember = aMember(0)
                  bMemberFound = True
                  Exit While
                End If
              End If
            Case Else
              m_oError.SetError("Der Membertype '{0}' für das Member '{1}' wird nicht unterstützt.", aMember(0).MemberType.ToString, sMemberName)
              GoTo Abbruch
          End Select
        Case Else
          m_oError.SetError("Es wurden mehr als ein Member mit dem Namen '{0}' am Objekt vom Typ '{1}' gefunden.", sMemberName, oCurrentType.ToString)
          GoTo Abbruch
      End Select
      '   Catch ex As Exception
      '    m_oError.seterror(ex, "Es ist ein Fehler beim Ermitteln des Members '{0}' im Object vom Typ '{1}' aufgetreten.", sMemberName, oObject.GetType.ToString)
      '   GoTo Abbruch
      'End Try
      oCurrentType = oCurrentType.BaseType
    End While
    If bMemberFound = False Then
      m_oError.SetError("Es wurde kein Member mit dem Namen '{0}' im Objekt vom Type '{1}' gefunden.", sMemberName, oObject.GetType.ToString)
      GoTo Abbruch
    End If
    TryToGetMemberFromObject = True
    
    Abbruch:
    
  End Function

  Shared Function Dummy()As String
    Return String.Empty</Source>
        <SourceComment>Begriff: {0}</SourceComment>
        <TargetFields></TargetFields>
        <MsgText>{0}</MsgText>
        <Picklist></Picklist>
        <Multiple>False</Multiple>
        <Expandable>True</Expandable>
        <OverwriteAlways>True</OverwriteAlways>
        <CopyToClipboard>False</CopyToClipboard>
        <ShowMsgBox>False</ShowMsgBox>
        <PositionMode>1</PositionMode>
        <FlatStyle>Standard</FlatStyle>
        <AutoDataText>Spalten setzen...</AutoDataText>
        <TextAlign>MiddleCenter</TextAlign>
        <AutoDataFormSize>160; 270</AutoDataFormSize>
        <TooltipText></TooltipText>
        <RefreshLoadedViews>False</RefreshLoadedViews>
    </AutoDataControl>
</AutoDataItems>