Showing posts with label SharePoint. Show all posts
Showing posts with label SharePoint. Show all posts

Tuesday, 14 December 2010

How To: Customizing alert emails using IAlertNotifyHandler

Nice post about How To: Customizing alert emails using IAlertNotifyHandler.
http://blogs.msdn.com/b/sharepointdeveloperdocs/archive/2007/12/14/how-to-customizing-alert-emails-using-ialertnotificationhandler.aspx

Customizing Alert Notifications and Alert Templates in Windows SharePoint Services 3.0

Nice post about how to customize alert notifications and alert templates in Windows SharePoint Services 3.0.

http://blogs.msdn.com/b/sharepointdeveloperdocs/archive/2007/12/07/customizing-alert-notifications-and-alert-templates-in-windows-sharepoint-services-3-0.aspx

Thursday, 25 February 2010

SharePoint Outlook Connector now works with SharePoint 2010

Finally I was able to make it working on SharePoint 2010. To be honest I did not have to do much things as most of the functionality worked pretty straightforward.

It also supports saving email meta data to SharePoint lists and attaching documents from SharePoint explorer panel.

Here is the link where you can download it.
http://spoutlookconnector.codeplex.com/

Monday, 15 February 2010

SharePointOutlookConnector

SharePointOutlookConnector makes it easier for outlook users to upload emails to SP and attach SP documents to an email message . You'll no longer have to save your email to desktop and upload from SP UI or download SP documents to your drive and attach them to your email.

http://spoutlookconnector.codeplex.com/

Wednesday, 16 December 2009

SharePoint Explorer in SharePoint 2010

SharePoint Server Explorer is a new feature in Visual Studio 2010. You can navigate between all objects in SharePoint 2010 but you are limited to see their properties only. The way to extend this control is creating a new class which will inherit from IExplorerNodeTypeExtension.

Saturday, 12 December 2009

How to add parameters from different sources to DataFormWebPart

Although DataFormWebPart supports several ways to get such as QueryString, Control values, CAML variable etc, There are some cases we need to assign parameters from codebehind. I am not going to show all the scenarios but I will give you hint how you can extend dataform webpart to allow taking parameter variables from different sources.

The first thing we need to do is, creating a new class which will inherit from DataFormWebPart.

using System;
using System.Text;
using Microsoft.SharePoint.WebPartPages;
public class EnhancedDataFormWebPart : DataFormWebPart
{
}

The way we do is, replacing ParameterBindings string property inside of DataFormWebPart. This property is a xml string. We will load it as xml document and use following properties to make it accessible in our code.

XmlDocument _ParameterBindingsXmlDocument = null;
XmlDocument ParameterBindingsXmlDocument
{
get
{
if (_ParameterBindingsXmlDocument == null)
{
_ParameterBindingsXmlDocument = new XmlDocument();
_ParameterBindingsXmlDocument.LoadXml("" + this.ParameterBindings + "");
}
return _ParameterBindingsXmlDocument;
}
}

XmlNode _ParameterBindingsXmlNode = null;
XmlNode ParameterBindingsXmlNode
{
get
{
if (_ParameterBindingsXmlNode == null)
{
_ParameterBindingsXmlNode = ParameterBindingsXmlDocument.SelectSingleNode("/ParameterBindings");
}
return _ParameterBindingsXmlNode;
}
}

Lets also add this helper class to be able to manipulate xml document.

private void SetParameterBinding(string key, string value)
{
XmlNode node = ParameterBindingsXmlNode.SelectSingleNode("/ParameterBindings/ParameterBinding[@Name = '" + key + "']");
if (node == null)
{
XmlNode parameterBindingNode = ParameterBindingsXmlDocument.CreateElement("ParameterBinding");

XmlAttribute nameAtrribute = ParameterBindingsXmlDocument.CreateAttribute("Name");
nameAtrribute.Value = key;
XmlAttribute locationAttribute = ParameterBindingsXmlDocument.CreateAttribute("Location");
locationAttribute.Value="None";
XmlAttribute defaultValueAttribute = ParameterBindingsXmlDocument.CreateAttribute("DefaultValue");
defaultValueAttribute.Value = value;

parameterBindingNode.Attributes.Append(nameAtrribute);
parameterBindingNode.Attributes.Append(locationAttribute);
parameterBindingNode.Attributes.Append(defaultValueAttribute);

ParameterBindingsXmlNode.AppendChild(parameterBindingNode);
}
else
{
node.Attributes["DefaultValue"].Value = value;
}
}

Here is the key method we are going to use. This is where we set our custom properties. Via using this you can set your binding parameters from anywhere you like (web.config property, sql data etc)

private void SetPropertiesAsParameterBindings()
{
SetParameterBinding("WebPartTitle", this.Title);
SetParameterBinding("WebPartTitleURL", this.TitleUrl);
this.ParameterBindings = ParameterBindingsXmlNode.InnerXml;
}

Last thing we should do is calling this method on OnLoad method of the webpart.

protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
SetPropertiesAsParameterBindings();
}

Now it is time to replace DataFormWebPart with our EnhancedDataFormWebPart.

Add this line into your page and replace values with appropriate values from your solution.

Here the webpart comes :)

<ExWebParts:EnhancedDataFormWebPart id="TasksDisplayDataFormWebPart" runat="server"
FrameType="None" NoDefaultStyle="TRUE" ViewFlag="1" Title="Tasks"
DisplayName="Tasks" __markuptype="vsattributemarkup"
__WebPartId="{418745AA-67C6-481e-95F9-5C824AD0CE61}" WebPart="true">

<DataSources>

<SharePointWebControls:SPDataSource runat="server" DataSourceMode="List"
UseInternalName="true" selectcommand="<View/>" id="SPDataSource1"><SelectParameters><webpartpages:DataFormParameter Name="ListName" ParameterKey="ListName"
PropertyName="ParameterValues" DefaultValue="Tasks"/>

</SelectParameters>


</SharePointWebControls:SPDataSource>

</DataSources>

<ParameterBindings>
<ParameterBinding Name="ListName" Location="None" DefaultValue="Tasks" />
<ParameterBinding Name="dvt_apos" Location="Postback;Connection" />
<ParameterBinding Name="UserID" Location="CAMLVariable"
DefaultValue="CurrentUserName" />
<ParameterBinding Name="Today" Location="CAMLVariable" DefaultValue="CurrentDate" />
<ParameterBinding Name="WebPartTitle" Location="None" DefaultValue="{Title}" />
<ParameterBinding Name="WebPartTitleURL" Location="None" DefaultValue="{TitleUrl}" />
</ParameterBindings>

<datafields>@ID,ID;@ContentType,ContentType;@Title,Title;@Modified,Modified;@Created,Created;@Author,Author;@Editor,Editor;@_UIVersionString,_UIVersionString;@Attachments,Attachments;@LinkTitleNoMenu,LinkTitleNoMenu;@LinkTitle,LinkTitle;@FileRef,FileRef;@FileDirRef,FileDirRef;@FSObjType,FSObjType;@ProgId,ProgId;@ScopeId,ScopeId;@DocIcon,DocIcon;@MetaInfo,MetaInfo;@Priority,Priority;@Status,Status;@PercentComplete,PercentComplete;@AssignedTo,AssignedTo;@TaskGroup,TaskGroup;@Body,Body;@StartDate,StartDate;@DueDate,DueDate;</datafields>

<XslLink>/Style Library/XSL Style Sheets/test.xsl</XslLink>

</ExWebParts:EnhancedDataFormWebPart>



Last thing you need to do is adding following lines into Style Library/XSL Style Sheets as test.xsl file .



<xsl:stylesheet xmlns:x="http://www.w3.org/2001/XMLSchema"
xmlns:d="http://schemas.microsoft.com/sharepoint/dsp" version="1.0"
exclude-result-prefixes="xsl msxsl ddwrt"
xmlns:ddwrt="http://schemas.microsoft.com/WebParts/v2/DataView/runtime"
xmlns:asp="http://schemas.microsoft.com/ASPNET/20"
xmlns:__designer="http://schemas.microsoft.com/WebParts/v2/DataView/designer"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:SharePoint="Microsoft.SharePoint.WebControls"
xmlns:ddwrt2="urn:frontpage:internal">

<xsl:output method="html" indent="no"/> <xsl:decimal-format NaN=""/>

<xsl:param name="dvt_apos">'</xsl:param>

<xsl:param name="WebPartTitle">

</xsl:param>

<xsl:param name="WebPartTitleURL"></xsl:param> <xsl:variable
name="dvt_1_automode">0</xsl:variable>

<xsl:template match="/">
WebPartTitleURL:<xsl:value-of select="$WebPartTitleURL"></xsl:value-of>
WebPartTitle:<xsl:value-of select="$WebPartTitle"></xsl:value-of>
<xsl:call-template name="dvt_1"/> </xsl:template>

<xsl:template name="dvt_1">

<xsl:variable name="Rows" select="/dsQueryResponse/Rows/Row"/>

<xsl:if test="$dvt_1_automode = '1'" ddwrt:cf_ignore="1">

</xsl:if>

<xsl:call-template name="dvt_1.body">

<xsl:with-param name="Rows" select="$Rows"/>

</xsl:call-template>

</xsl:template>

<xsl:template name="dvt_1.body">

<xsl:param name="Rows"/>

<xsl:for-each select="$Rows">

<xsl:call-template name="dvt_1.rowview"/>

</xsl:for-each>

</xsl:template>

<xsl:template name="dvt_1.rowview"> Title: <xsl:value-of select="@Title"/><br/>

</xsl:template>

</xsl:stylesheet>

Thursday, 25 June 2009

SPDataSource

There are many ways to retrieve SharePoint content such as SPDataSource, SPQuery
and looping through in SharePoint Object library.

Today we will have a look at the SPDataSource. SPDataSource is an object
datasource which supply information from SharePoint by given parameters.



Here is a sample of SPDataSource syntax.

<SharePointWebControls:SPDataSource runat="server" DataSourceMode="List"
UseInternalName="true" selectcommand="<View/>" id="SPDataSource1">

<SelectParameters>

<webpartpages:DataFormParameter Name="ListName" ParameterKey="ListName"
PropertyName="ParameterValues" DefaultValue="Tasks"/>

</SelectParameters>


</SharePointWebControls:SPDataSource>



DataSourceMode:
(

http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.webcontrols.spdatasource.datasourcemode.aspx

)

• List: Retrieves
data from a list


<SharePoint:SPDataSource ID="SPDataSource1"
runat="server" DataSourceMode="List" UseInternalName="true"
SelectCommand="<Query><OrderBy><FieldRef Name='DueDate' Ascending='true'
/></OrderBy></Query>">

<SelectParameters>

<asp:Parameter
Name="ListName" DefaultValue="Tasks" />

<asp:Parameter
Name="WebID" DefaultValue="RootWeb" />

</SelectParameters>

</SharePoint:SPDataSource>




<asp:GridView ID="GridView1"
runat="server" DataSourceID="SPDataSource1" AutoGenerateColumns="false">

<Columns>

<asp:BoundField HeaderText="Due Date"
DataField="DueDate" />

<asp:BoundField HeaderText="Priority"
DataField="Priority" />

<asp:BoundField HeaderText="Title"
DataField="Title" />

<asp:BoundField HeaderText="Status"
DataField="Status" />

</Columns>

</asp:GridView>



• ListItem: Retrieves
data from a single list item


<SharePoint:SPDataSource
ID="SPDataSource1" runat="server" DataSourceMode="ListItem"
UseInternalName="true" >


<SelectParameters>

<asp:Parameter
Name="WebID" DefaultValue="RootWeb" />

<asp:Parameter
Name="ListName" DefaultValue="Announcements" />

<asp:Parameter
Name="ListItemID" DefaultValue="1" />


</SelectParameters>


</SharePoint:SPDataSource>


<asp:GridView
ID="GridView1" runat="server" DataSourceID="SPDataSource1"
AutoGenerateColumns="false">

<Columns>


<asp:BoundField
HeaderText="Title" DataField="Title" />

<asp:BoundField
HeaderText="Expires" DataField="Expires" />

</Columns>

</asp:GridView>



• CrossList:
Retrieves data from multiple lists in multiple websites in the same site
collection.



<SharePoint:SPDataSource ID="SPDataSource1" runat="server"
DataSourceMode="CrossList" UseInternalName="true" SelectCommand="<Webs
Scope='Recursive'></Webs> <Lists ServerTemplate='106'></Lists> <View>
<ViewFields> <FieldRef Name='EventDate'/> <FieldRef Name='Title'/> <FieldRef
Name='Location'/ </ViewFields> <Query> <Where> <And> <Eq> <FieldRef
Name='Location'/> <Value Type='Text'>Your office</Value> </Eq> <Eq> <FieldRef
Name='EventDate'/> <Value Type='DateTime'><Today/></Value> </Eq> </And> </Where>
</Query> </View>" >


</SharePoint:SPDataSource>

<asp:GridView
ID="GridView1" runat="server" DataSourceID="SPDataSource1"
AutoGenerateColumns="false" Width="75%" HeaderStyle-HorizontalAlign="Left" >

<Columns>

<asp:BoundField
HeaderText="Date" DataField="EventDate" />

<asp:BoundField
HeaderText="Title" DataField="Title" />

<asp:BoundField
HeaderText="Location" DataField="Location" />

</Columns>

</asp:GridView>



• ListOfLists:
Retrieves properties of lists in a specified web site.



<SharePoint:SPDataSource ID="SPDataSource1" runat="server"
DataSourceMode="CrossList" UseInternalName="true" SelectCommand="<Webs
Scope='Recursive'></Webs> <Lists ServerTemplate='106'></Lists> <View>
<ViewFields> <FieldRef Name='EventDate'/> <FieldRef Name='Title'/> <FieldRef
Name='Location'/ </ViewFields> <Query> <Where> <And> <Eq> <FieldRef
Name='Location'/> <Value Type='Text'>Your office</Value> </Eq> <Eq> <FieldRef
Name='EventDate'/> <Value Type='DateTime'><Today/></Value> </Eq> </And> </Where>
</Query> </View>" >


</SharePoint:SPDataSource>

<asp:GridView
ID="GridView1" runat="server" DataSourceID="SPDataSource1"
AutoGenerateColumns="false" Width="75%" HeaderStyle-HorizontalAlign="Left" >

<Columns>


<asp:BoundField
HeaderText="Date" DataField="EventDate" />

<asp:BoundField
HeaderText="Title" DataField="Title" />


<asp:BoundField
HeaderText="Location" DataField="Location" />


</Columns>

</asp:GridView>



• Web: Retrieves
properties of subsites of the current web site.



<SharePoint:SPDataSource ID="SPDataSource1" runat="server" DataSourceMode="Webs"
IncludeHidden="true">


<SelectParameters>

<asp:Parameter
Name="WebId" DefaultValue="RootWeb" />


</SelectParameters>


</SharePoint:SPDataSource>

<asp:GridView
ID="GridView1" runat="server" DataSourceID="SPDataSource1"
AutoGenerateColumns="false">

<Columns>

<asp:BoundField
HeaderText="Site Title" DataField="__spTitle" />

<asp:BoundField
HeaderText="URL" DataField="__spUrl" />

<asp:BoundField
HeaderText="ID" DataField="__spID" />

<asp:BoundField
HeaderText="Web Template" DataField="__spWebTemplate" />

<asp:BoundField
HeaderText="Web Template Id" DataField="__spWebTemplateId" />

</Columns>

</asp:GridView>



SelectCommand: This is where we define our
query to get data. CAML is the query syntax. Custom parameters such as
QueryString, existing variables, programmatically defined
parameterbindings can be used.

SelectParameters (

http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.webcontrols.spdatasource.selectparameters.aspx

): That is used to define to
pass parameters into data control.

Following list states
what can be assigned as default values




































WebID

”RootWeb” for the root Web site. Otherwise, a string representation of a GUID
such as the value of the SPWeb.ID property.

WebURL

An empty string for the root Web site. Otherwise, a string containing a
server-relative URL.

ListID

A string representation of a GUID such as the value of the SPList.ID property.

ListName

The value of the SPList.Title property.

ListItemGUID

A A string representation of a GUID such as the value of the SPListItem.UniqueId
property.

ListItemID

A string representation of an integer such as the value of the SPListItem.ID
property.

RootFolder

The value of the SPFolder.Name property.

FolderID

A string representation of a GUID such as the value of the SPFolder.UniqueId
property.

Additionally we can assign parameters from;

QueryString: <asp:QueryStringParameter Name="CompanyName"
QueryStringField="Company" DefaultValue="Contoso" />


Control: <asp:ControlParameter Name="CompanyName" ControlID="DropDownList1"
PropertyName="SelectedValue" />

ParameterBinding: <webpartpages:DataFormParameter Name="PostID"
ParameterKey="PostID" PropertyName="ParameterValues" DefaultValue="0"/>