Friday, March 14, 2014

C# - Resizing Arrays - Add String to String Array

Guys,
here's a simple way to add a string to a string array (C#):

String[] Sorting;
foreach (String StringObj in StringObjCollection)
{
     Array.Resize(ref Sorting, Sorting.Length + 1);
     Sorting[Sorting.Length - 1] = StringObj;
}

C# - CollectionBase - Sorting a collection

Based on my blog post about creating a collection using the CollectionBase class yesterday, I figured out, how to sort a collection based on the class CollectionBase.

public List<MyClass> SortByColumnSortColumn()
{
     List<MyClass> SortedList = this.List.Cast<MyClass>().ToList();
     SortedList = SortedList.OrderBy(x => x.SortColumn).ToList();
     return SortedList;
}

Thursday, March 13, 2014

C# - Creating a Collection class


Creating a simple Collection class is very easy.
Assuming we have a class like this and want to create a collection class from it...

public class MyClass
{
     public string Name;

     public MyClass()
     {
     }
}

We can easily create a collection of it by using the CollectionBase class in the .NET Framework.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace My_Project.Classes
{
    public class MyClassCollection : System.Collections.CollectionBase
    {
        #region Variables
        #endregion

        #region Properties
        #endregion

        #region Constructors
        #endregion

        #region Methods

        public void Add(My_Project.Classes.MyClass NewMyClassObject)
        {
            List.Add(NewMyClassObject);
        }

        public void Remove(int index)
        {
            // Check to see if there is a MyClass at the supplied index.
            if (index > Count - 1 || index < 0)
            // If no MyClass exists, a messagebox is shown and the operation 
            // is cancelled.
            {
                throw new Exception();
            }
            else
            {
                List.RemoveAt(index);
            }
        }

        public My_Project.Classes.MyClass Item(int Index)
        {
            // The appropriate item is retrieved from the List object and
            // explicitly cast to the MyClass type, then returned to the 
            // caller.
            return (My_Project.Classes.MyClass)List[Index];
        }
        #endregion
    }
}

Now we can use the Collection class:

// create MyClass Object 1:
MyClass MyClassObject1 = new MyClass();

//create MyClass Object 2:
MyClass MyClassObject2 = new MyClass();

//creating the collection object:
MyClassCollection Col = new MyClassCollection();

//adding both objects to the collection
Col.Add(MyClassObject1);
Col.Add(MyClassObject2);

//removing an object from the collection:
Col.Remove(1);

//getting the item object from a collection
MyClass NewObject = Col.Item(0);


Here is a good walkthrough from Microsoft:

http://msdn.microsoft.com/en-us/library/xth2y6ft(v=vs.71).aspx

SharePoint - Internal Names List

Here is a list of internal field names in SharePoint.

Document Library fields
Display NameInternal NameGUIDType
IDID{1d22ea11-1e32-424e-89ab-9fedbadb6ce1}Counter
Content Type IDContentTypeId{03e45e84-1992-4d42-9116-26f756012634}ContentTypeId
Content TypeContentType{c042a256-787d-4a6f-8a8a-cf6ab767f12d}Text
CreatedCreated{8c06beca-0777-48f7-91c7-6da68bc07b69}DateTime
Created ByAuthor{1df5e554-ec7e-46a6-901d-d85a3881cb18}User
ModifiedModified{28cf69c5-fa48-462a-b5cd-27b6f9d2bd5f}DateTime
Modified ByEditor{d31655d1-1d5b-4511-95a1-7a09e9b75bf2}User
Has Copy Destinations_HasCopyDestinations{26d0756c-986a-48a7-af35-bf18ab85ff4a}Boolean
Copy Source_CopySource{6b4e226d-3d88-4a36-808d-a129bf52bccf}Text
Approval Status_ModerationStatus{fdc3b2ed-5bf2-4835-a4bc-b885f3396a61}ModStat
Approver Comments_ModerationComments{34ad21eb-75bd-4544-8c73-0e08330291fe}Note
URL PathFileRef{94f89715-e097-4e8b-ba79-ea02aa8b7adb}Lookup
PathFileDirRef{56605df6-8fa1-47e4-a04c-5b384d59609f}Lookup
ModifiedLast_x0020_Modified{173f76c8-aebd-446a-9bc9-769a2bd2c18f}Lookup
CreatedCreated_x0020_Date{998b5cff-4a35-47a7-92f3-3914aa6aa4a2}Lookup
File SizeFile_x0020_Size{8fca95c0-9b7d-456f-8dae-b41ee2728b85}Lookup
Item TypeFSObjType{30bb605f-5bae-48fe-b4e3-1f81d9772af9}Lookup
Effective Permissions MaskPermMask{ba3c27ee-4791-4867-8821-ff99000bac98}Computed
ID of the User who has the item Checked OutCheckedOutUserId{a7b731a3-1df1-4d74-a5c6-e2efba617ae2}Lookup
Is Checked out to localIsCheckedoutToLocal{cfaabd0f-bdbd-4bc2-b375-1e779e2cad08}Lookup
Checked Out ToCheckoutUser{3881510a-4e4a-4ee8-b102-8ee8e2d0dd4b}User
NameFileLeafRef{8553196d-ec8d-4564-9861-3dbe931050c8}File
Unique IdUniqueId{4b7403de-8d94-43e8-9f0f-137a3e298126}Lookup
ProgIdProgId{c5c4b81c-f1d9-4b43-a6a2-090df32ebb68}Lookup
ScopeIdScopeId{dddd2420-b270-4735-93b5-92b713d0944d}Lookup
Virus StatusVirusStatus{4a389cb9-54dd-4287-a71a-90ff362028bc}Lookup
Checked Out ToCheckedOutTitle{9d4adc35-7cc8-498c-8424-ee5fd541e43a}Lookup
Check In Comment_CheckinComment{58014f77-5463-437b-ab67-eec79532da67}Lookup
Checked Out ToLinkCheckedOutTitle{e2a15dfd-6ab8-4aec-91ab-02f6b64045b0}Computed
Document Modified ByModified_x0020_By{822c78e3-1ea9-4943-b449-57863ad33ca9}Text
Document Created ByCreated_x0020_By{4dd7e525-8d6b-4cb4-9d3e-44ee25f973eb}Text
File TypeFile_x0020_Type{39360f11-34cf-4356-9945-25c44e68dade}Text
HTML File TypeHTML_x0020_File_x0020_Type{0c5e0085-eb30-494b-9cdd-ece1d3c649a2}Text
Source Url_SourceUrl{c63a459d-54ba-4ab7-933a-dcf1c6fadec2}Text
Shared File Index_SharedFileIndex{034998e9-bf1c-4288-bbbd-00eacfc64410}Text
Edit Menu Table Start_EditMenuTableStart{3c6303be-e21f-4366-80d7-d6d0a3b22c7a}Computed
Edit Menu Table End_EditMenuTableEnd{2ea78cef-1bf9-4019-960a-02c41636cb47}Computed
NameLinkFilenameNoMenu{9d30f126-ba48-446b-b8f9-83745f322ebe}Computed
NameLinkFilename{5cc6dc79-3710-4374-b433-61cb4a686c12}Computed
TypeDocIcon{081c6e4c-5c14-4f20-b23e-1a71ceb6a67c}Computed
Server Relative URLServerUrl{105f76ce-724a-4bba-aece-f81f2fce58f5}Computed
Encoded Absolute URLEncodedAbsUrl{7177cfc7-f399-4d4d-905d-37dd51bc90bf}Computed
NameBaseName{7615464b-559e-4302-b8e2-8f440b913101}Computed
File SizeFileSizeDisplay{78a07ba4-bda8-4357-9e0f-580d64487583}Computed
Property BagMetaInfo{687c7f94-686a-42d3-9b67-2782eac4b4f8}Lookup
Level_Level{43bdd51b-3c5b-4e78-90a8-fb2087f71e70}Integer
Is Current Version_IsCurrentVersion{c101c3e7-122d-4d4d-bc34-58e94a38c816}Boolean
SelectSelectTitle{b1f7969b-ea65-42e1-8b54-b588292635f2}Computed
SelectSelectFilename{5f47e085-2150-41dc-b661-442f3027f552}Computed
EditEdit{503f1caa-358e-4918-9094-4a2cdc4bc034}Computed
owshiddenversionowshiddenversion{d4e44a66-ee3a-4d02-88c9-4ec5ff3f4cd5}Integer
UI Version_UIVersion{7841bf41-43d0-4434-9f50-a673baef7631}Integer
Version_UIVersionString{dce8262a-3ae9-45aa-aab4-83bd75fb738a}Text
Instance IDInstanceID{50a54da4-1528-4e67-954a-e2d24f1e9efb}Integer
OrderOrder{ca4addac-796f-4b23-b093-d2a3f65c0774}Number
GUIDGUID{ae069f25-3ac2-4256-b9c3-15dbc15da0e0}Guid
Workflow VersionWorkflowVersion{f1e020bc-ba26-443f-bf2f-b68715017bbc}Integer
Workflow Instance IDWorkflowInstanceID{de8beacf-5505-47cd-80a6-aa44e7ffe2f4}Guid
Source Version (Converted Document)ParentVersionString{bc1a8efb-0f4c-49f8-a38f-7fe22af3d3e0}Lookup
Source Name (Converted Document)ParentLeafName{774eab3a-855f-4a34-99da-69dc21043bec}Lookup
TitleTitle{fa564e0f-0c70-4ab9-b863-0177e6ddd247}Text
Template LinkTemplateUrl{4b1bf6c6-4f39-45ac-acd5-16fe7a214e5e}Text
Html File Linkxd_ProgID{cd1ecb9f-dd4e-4f29-ab9e-e9ff40048d64}Text
Is Signedxd_Signature{fbf29b2d-cae5-49aa-8e0a-29955b540122}Boolean
MergeCombine{e52012a0-51eb-4c0c-8dfb-9b8a0ebedcb6}Computed
RelinkRepairDocument{5d36727b-bcb2-47d2-a231-1f0bc63b7439}Computed

 Custom list fields 
Display NameInternal NameGUIDType
IDID{1d22ea11-1e32-424e-89ab-9fedbadb6ce1}Counter
Content Type IDContentTypeId{03e45e84-1992-4d42-9116-26f756012634}ContentTypeId
Content TypeContentType{c042a256-787d-4a6f-8a8a-cf6ab767f12d}Text
TitleTitle{fa564e0f-0c70-4ab9-be6ddd247}Text
ModifiedModified{28cf69c5-fa48-462a-b5cd-27b6f9d2bd5f}DateTime
CreatedCreated{8c06beca-0777-48f7-91c7-6da68bc07b69}DateTime
Created ByAuthor{1df5e554-ec7e-46a6-901d-d85a3881cb18}User
Modified ByEditor{d31655d1-1d5b-4511-95a1-7a09e9b75bf2}User
Has Copy Destinations_HasCopyDestinations{26d0756c-986a-48a7-af35-bf18ab85ff4a}Boolean
Copy Source_CopySource{6b4e226d-3d88-4a36-808d-a129bf52bccf}Text
owshiddenversionowshiddenversion{d4e44a66-ee3a-4d02-88c9-4ec5ff3f4cd5}Integer
Workflow VersionWorkflowVersion{f1e020bc-ba26-443f-bf2f-b68715017bbc}Integer
UI Version_UIVersion{7841bf41-43d0-4434-9f50-a673baef7631}Integer
Version_UIVersionString{dce8262a-3ae9-45aa-aab4-83bd75fb738a}Text
AttachmentsAttachments{67df98f4-9dec-48ff-a553-29bece9c5bf4}Attachments
Approval Status_ModerationStatus{fdc3b2ed-5bf2-4835-a4bc-b885f3396a61}ModStat
Approver Comments_ModerationComments{34ad21eb-75bd-4544-8c73-0e08330291fe}Note
EditEdit{503f1caa-358e-4918-9094-4a2cdc4bc034}Computed
TitleLinkTitleNoMenu{bc91a437-52e7-49e1-8c4e-4698904b2b6d}Computed
TitleLinkTitle{82642ec8-ef9b-478f-acf9-31f7d45fbc31}Computed
SelectSelectTitle{b1f7969b-ea65-42e1-8b54-b588292635f2}Computed
Instance IDInstanceID{50a54da4-1528-4e67-954a-e2d24f1e9efb}Integer
OrderOrder{ca4addac-796f-4b23-b093-d2a3f65c0774}Number
GUIDGUID{ae069f25-3ac2-4256-b9c3-15dbc15da0e0}Guid
Workflow Instance IDWorkflowInstanceID{de8beacf-5505-47cd-80a6-aa44e7ffe2f4}Guid
URL PathFileRef{94f89715-e097-4e8b-ba79-ea02aa8b7adb}Lookup
PathFileDirRef{56605df6-8fa1-47e4-a04c-5b384d59609f}Lookup
ModifiedLast_x0020_Modified{173f76c8-aebd-446a-9bc9-769a2bd2c18f}Lookup
CreatedCreated_x0020_Date{998b5cff-4a35-47a7-92f3-3914aa6aa4a2}Lookup
Item TypeFSObjType{30bb605f-5bae-48fe-b4e3-1f81d9772af9}Lookup
Effective Permissions MaskPermMask{ba3c27ee-4791-4867-8821-ff99000bac98}Computed
NameFileLeafRef{8553196d-ec8d-4564-9861-3dbe931050c8}File
Unique IdUniqueId{4b7403de-8d94-43e8-9f0f-137a3e298126}Lookup
ProgIdProgId{c5c4b81c-f1d9-4b43-a6a2-090df32ebb68}Lookup
ScopeIdScopeId{dddd2420-b270-4735-93b5-92b713d0944d}Lookup
File TypeFile_x0020_Type{39360f11-34cf-4356-9945-25c44e68dade}Text
HTML File TypeHTML_x0020_File_x0020_Type{4ef1b78f-fdba-48dc-b8ab-3fa06a0c9804}Computed
Edit Menu Table Start_EditMenuTableStart{3c6303be-e21f-4366-80d7-d6d0a3b22c7a}Computed
Edit Menu Table End_EditMenuTableEnd{2ea78cef-1bf9-4019-960a-02c41636cb47}Computed
NameLinkFilenameNoMenu{9d30f126-ba48-446b-b8f9-83745f322ebe}Computed
NameLinkFilename{5cc6dc79-3710-4374-b433-61cb4a686c12}Computed
TypeDocIcon{081c6e4c-5c14-4f20-b23e-1a71ceb6a67c}Computed
Server Relative URLServerUrl{105f76ce-724a-4bba-aece-f81f2fce58f5}Computed
Encoded Absolute URLEncodedAbsUrl{7177cfc7-f399-4d4d-905d-37dd51bc90bf}Computed
File NameBaseName{7615464b-559e-4302-b8e2-8f440b913101}Computed
Property BagMetaInfo{687c7f94-686a-42d3-9b67-2782eac4b4f8}Lookup
Level_Level{43bdd51b-3c5b-4e78-90a8-fb2087f71e70}Integer
Is Current Version_IsCurrentVersion{c101c3e7-122d-4d4d-bc34-58e94a38c816}Boolean

Tuesday, March 11, 2014

C# - SharePoint 2010 - Building a SharePoint 2010 feature, which creates new content types with new site columns programmatically

Hi guys,

I thought, I try to write in English instead of German language now to reach more people. Sorry, for my bad english in advance. :-)
This code gives you a nice way to create new content types with new site columns programmatically in a SharePoint 2010 Feature (C# / Visual Studio 2010). The difficulty is to create a new site column from a managed metadata service. This code took me 1 day, but it works fine now. Have fun with it.
If you have any hints, to improve the code please write a comment below. Thanks. :-)

const string TermStore = "Managed Metadata Service";
const string TermStoreGroup = "TermStoreGroup";
object[][] Data = new object[][] 

//new object[] { 0="Content Type Name", 1="Field Name", 2="Field Type", 3="Required", 4="AllowMultipleValues" }
new object[] { "Content Type Name", "Property 1", "TaxonomyFieldType", true, false },
new object[] { "Content Type Name", "Property 2", "TaxonomyFieldType", true, false },
new object[] { "Content Type Name", "Property 3", "TaxonomyFieldType", false, false },
new object[] { "Content Type Name", "Property 4", "TaxonomyFieldType", false, false },
new object[] { "Content Type Name", "Property 5", SPFieldType.Text, false, null },
new object[] { "Content Type Name", "Property 6", SPFieldType.DateTime, true, null }
};

static SPField AddField(string title, SPFieldType type, Boolean required, SPFieldCollection fields)
{
// If the field is not in the collection,
if (!fields.ContainsField(title))
{
// Add it.
fields.Add(title, type, required);
}
return fields.GetField(title);
}

static void AddFieldLink(SPField field, SPContentType contentType)
{
// Is the FieldLink in the collection?
SPFieldLink fieldLink = contentType.FieldLinks[field.Id];
if (fieldLink == null) // No, so add it.
{
fieldLink = new SPFieldLink(field);
contentType.FieldLinks.Add(fieldLink);
}
}

static void AddFieldLink(TaxonomyField field, SPContentType contentType)
{
SPFieldLink fieldLink = new SPFieldLink(field);
if (contentType.FieldLinks[fieldLink.Id] == null) 
{
contentType.FieldLinks.Add(fieldLink);
}
}

public override void FeatureActivated(SPFeatureReceiverProperties properties)
{
try
{
using (SPWeb spWeb = properties.Feature.Parent as SPWeb)
{
foreach (object[] CurrentData in Data)
{
SPContentType contentType;
if (spWeb.ContentTypes[CurrentData[0].ToString()] == null)
{
contentType = new SPContentType(spWeb.ContentTypes["Document"], spWeb.ContentTypes, CurrentData[0].ToString());
contentType.Group = "Content Type Group";
spWeb.ContentTypes.Add(contentType);
spWeb.Update();
}
else
{
contentType = spWeb.ContentTypes[CurrentData[0].ToString()];
}
if (CurrentData[2].ToString() == "TaxonomyFieldType")
{
using (SPSite site = new SPSite(spWeb.Site.ID))
{
TaxonomySession taxonomySession = new TaxonomySession(site);
TermStore termStore = taxonomySession.TermStores[TermStore];
Group termStoreGroup = termStore.Groups[TermStoreGroup];
TaxonomyField NewField;
if (spWeb.Fields.ContainsField(CurrentData[1].ToString()) == false || (spWeb.Fields.ContainsField(CurrentData[1].ToString()) == true && spWeb.Fields[CurrentData[1].ToString()].TypeAsString != CurrentData[2].ToString()))
{
TermSet termSet = termStoreGroup.TermSets[CurrentData[1].ToString()];
NewField = (TaxonomyField)spWeb.Fields.CreateNewField("TaxonomyFieldType", CurrentData[1].ToString());
NewField.SspId = termSet.TermStore.Id;
NewField.Group = termStoreGroup.Name;
NewField.TermSetId = termSet.Id;
NewField.AllowMultipleValues = (Boolean)CurrentData[4];
NewField.TargetTemplate = string.Empty;
NewField.CreateValuesInEditForm = false;
NewField.Open = false;
NewField.AnchorId = Guid.Empty;
NewField.Title = CurrentData[1].ToString();
NewField.Required = (Boolean)CurrentData[3];
spWeb.Fields.Add(NewField);
spWeb.Update();
NewField = (TaxonomyField)spWeb.Fields[CurrentData[1].ToString()];
}
else
{
NewField = (TaxonomyField)spWeb.Fields[CurrentData[1].ToString()];
}
AddFieldLink(NewField, contentType);
}
}
else
{
SPField NewField = AddField(CurrentData[1].ToString(), (SPFieldType)CurrentData[2], (Boolean)CurrentData[3], spWeb.Fields);
AddFieldLink(NewField, contentType);
}
contentType.Update();
}
}
}
catch (Exception exp)
{
throw;
}
}

Friday, March 7, 2014

Visual Studio 2010 - SharePoint 2010 - Debugging - "The breakpoint will not currently be hit. No symbols have been loaded for this document"

SharePoint Solutions zu debuggen kann manchmal schwierig sein. Ich stoplerte über das Problem, dass der Debugger an der markierten Stelle nicht anhielt, sondern stattdessen nur die Meldung brachte: "The breakpoint will not currently be hit. No symbols have been loaded for this document". "Hmm, wieso funktioniert der Debugger nicht. Der müßte doch da rein laufen. Und jetzt? Was tun?", waren meine ersten Gedanken. 
Das Problem ist aber relativ schnell gelöst.

Über "Project" im Menü auf den "Project - Properties" navigieren:















Auf den Punkt "SharePoint" navigieren und dort unter "Active Deployment Configuration" den Punkt "No activation" auswählen.

















Nun wird beim Starten des Projekts das Feature nicht automatisch aktiviert, sondern man muss es manuell aktivieren. Sobald das Feature manuell aktiviert wird, läuft der Debugger wie gewohnt.

Das ganze ist auch hier beschrieben: