SharePoint

Adding SPTimerJob in a FeatureReceiver

In one of my solutions I wanted to add a SPTimerJob through a FeatureReceiver in the feature. The feature was scoped to “Web”. I got an “Access denied” when I tried to do so. The solution I found, was to create a second feature, which was scoped to “WebApplication”. From within this feature, I was able to create my timer job. But only in FeatureActivated. When I tried to add the job from FeatureInstalled, I got the error that SharePoint did not find the assembly, even if it was installed to the GAC.

Use JavaScript within a SPGridView

The NavigateUrlFormat property of the SPMenuField allows you to specify a Url, which will be called if you click the field in a SPGridView. 1: SPMenuField colMenu = new SPMenuField(); <pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"><span style="color:#606060"> 2:</span> colMenu.NavigateUrlFields = <span style="color:#006080">"WebUrl,AlertID,ListID"</span>;</pre> <pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"><span style="color:#606060"> 3:</span> colMenu.NavigateUrlFormat = <span style="color:#006080">"{0}/_layouts/SubEdit.aspx?Alert={1}&List={2};</pre> 4: colMenu.TokenNameAndValueFields = "</span>WEBURL=WebUrl,ALERTID=AlertID,LISTID=ListId"; With the TokenNameAndValueFields property, you map the grid columns to %xyz%. If you want to use a JavaScript instead, you can do so: 1: MenuItemTemplate editAlertMenu = new MenuItemTemplate("

Configuring Kerberos for SharePoint

Kerberos has some advantages over NTLM. Only with Kerberos it is possible to pass the client credentials (meaning the user who logged himself on to the SharePoint website) to another server. This is important, if you use e.g. my Fileserver Access Webpart and configure it to a share on a server, which is **not** your SharePoint Server. If you want to know more about Kerberos, you can look at Kerberos Explained on the Microsoft Technet pages.

Access Fileserver Data via SharePoint

**Update: ** The Webpart is not (yet) working as expected. Ajax only works for postbacks. The initial load will take longer, if you have many directories. I am working on this… **Update2: ** Almost done! Ajax is working fine. Ajax is registered, so you don’t need to modify the web.config yourself. Todo: Performance. Hang on just a little more. **Update3: ** Done. I have worked on my Webpart. It will now be faster and it is working 🙂

Custom Formatting in a SPGridView

One of the problems with the SPGridView occurs, if you display e.g. the file size of files, and try to sort with this information. The internal value you get from a SPFile of FileInfo Object shows you the length of the file in bytes. This is great if you want to sort this column. But what if you choose to display the long value with the amount of bytes for a file not as the value, but formatted with SPUtility.

Permissions Webservice and the Mask Attribute

With the SharePoint Permissions Webservice you can get the Permissions from a List or Web. The Webservice returns information like this example from the WSS SDK: 1: <GetPermissionCollection xmlns=“ http://schemas.microsoft.com/sharepoint/soap/directory/"> <span class=lnum> 2: </span> <Permissions> 3: "1073741829" Mask="-1" MemberIsUser="False" MemberGlobal="False" <span class=lnum> 4: </span> RoleName=<span class=str>"Administrator"</span> /> 5: "1073741828" Mask="1029638927" MemberIsUser="False" MemberGlobal="False" <span class=lnum> 6: </span> RoleName=<span class=str>"Web Designer"</span> /> 7: "1073741827" Mask="1027801615" MemberIsUser="False" MemberGlobal="False" <span class=lnum> 8: </span> RoleName=<span class=str>"

EventHandler which sends an Email for new/changed items

What do you do if you want to be alerted for changes in a list? ![][1] Right. You set an alert. Or you can create a workflow with your SharePoint Designer. But there is a different way. With my "RH.ItemNotifier" Feature, you can configure alerts through the settings of a list. ![][2] Configure Users which need to be emailed for new items or changes to existing ones. ![][3] So why would you use this solution to create alerts?

Iterate through all SPWeb objects in your farm

Sometimes you need to hit all webs in your SharePoint farm. This is the code how you can achieve this task: 1: SPFarm farm = SPContext.Current.Site.WebApplication.Farm; <pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"><span style="color:#606060"> 2:</span> SPWebService service = farm.Services.GetValue&lt;SPWebService&gt;(<span style="color:#006080">""</span>);</pre> <pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"><span style="color:#606060"> 3:</span> </pre> <pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:#f4f4f4;border-bottom-style:none"><span style="color:#606060"> 4:</span> <span style="color:#0000ff">foreach</span> (SPWebApplication webApplication <span style="color:#0000ff">in</span> service.WebApplications)</pre> <pre style="padding-right:0px;padding-left:0px;font-size:8pt;padding-bottom:0px;margin:0em;overflow:visible;width:100%;color:black;border-top-style:none;line-height:12pt;padding-top:0px;font-family:consolas, 'Courier New', courier, monospace;border-right-style:none;border-left-style:none;background-color:white;border-bottom-style:none"><span style="color:#606060"> 5:</span> <span style="color:#0000ff">foreach</span> (SPSite site <span style="color:#0000ff">in</span> webApplication.

WarmupSharePoint

Just a small update to my “WarmupSharePoint” tool, which loads all SharePoint websites initially, so the access to all sites is quicker. The difference to other warmup scripts is, that this one calls every site within the sitecollection! You can now specify the “AllSites” parameter. With this parameter passed to the tool, it will iterate through all sitecollections of the webapplication. This is usefull for the MySite webapplication, or any other webapplication with lots of sitecollections.

Get default page Url

l know it is not a smooth approach, but a working one. How do you get the default Url from an SPWeb? If you have the publishing feature activated, you can use PublishingWeb.DefaultPage property. But not for WSS. 1: internal static string GetDefaultWebUrl(string webUrl) <pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"><span style="color:#606060"> 2:</span> {</pre> <pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:white;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"><span style="color:#606060"> 3:</span> WebRequest request = WebRequest.Create(webUrl);</pre> <pre style="border-bottom-style:none;padding-bottom:0px;line-height:12pt;border-right-style:none;background-color:#f4f4f4;margin:0em;padding-left:0px;width:100%;padding-right:0px;font-family:consolas, 'Courier New', courier, monospace;border-top-style:none;color:black;font-size:8pt;border-left-style:none;overflow:visible;padding-top:0px"><span style="color:#606060"> 4:</span> request.

Error 0x80020009

I am sure you all know the Best Practices: Using Disposable Windows SharePoint Services Objects Guide from Microsoft. If not, read it 🙂 Please be carefull what objects you dispose after you don’t need them anymore. If you dispose the SPContext.Current.Site object, you might get strange behaviours. e.g. you might not be able to save Webpart properties. Doing so, will generate an error: Cannot save the property settings for this Web Part.