One of the issue or we can say a bug that i found in new SharePoint 2010 version and it is confirmed from Microsoft team.
Issue is like this,
If you try to create a lookup column and select list from which you are setting lookup column, you will not get choice field columns in primary as well as secondary fields. For testing purpose take Task list and check the fields in dropdown as well as checkbox
ID
Title
Modified
Created
Version
Title (linked to item)
% Complete
Start Date
Due Date
You never get Priority and Status columns
On one of the Microsoft blog, i found a post where they say it is supporting but it's not true, Here below it is
Create list relationships by using lookup and unique columns
get confirmation from this post
Restrictions on additional columns available for addition with Lookup column?
Hope in upcoming hotfix this bug will be solved...!
Saturday, February 26, 2011
Thursday, February 17, 2011
Awarded Microsoft Community Contributor
Hi Friends,
Today i have been awarded as Microsoft Community Contributor, Thanks Microsoft and all Friends/Microsoft Community Members who trust on me and my contributions.
Today i have been awarded as Microsoft Community Contributor, Thanks Microsoft and all Friends/Microsoft Community Members who trust on me and my contributions.
Saturday, January 1, 2011
Deploying webpart in SharePoint
We can deploy webpart to SharePoint site either deploying assembly to BIN or GAC.
Some steps are mandatory for this
Steps
1: Put assembly in web application BIN or WFE's (Web Front End Server) GAC
2: Register assembly as safe control in web.config of web application
3: Add .webpart file into webpart gallery
1: Put assembly in web application BIN or WFE's (Web Front End Server) GAC
2: Register assembly as safe control in web.config of web application
3: Add .webpart file into webpart gallery
Let's see master's(Andrew Cornell) quote on this 3rd point
In order to make the Web Part discoverable, or enable users to pick the Web Part from a list of available Web Parts, a Web Part definition file must exist in one of two places: the Web Part Gallery in a top – level site of a site collection or the wpcatalog folder within the Web root of a site ’ s hosting Web application. If the Web Part definition is deployed to the wpcatalog folder, all sites within all site collections within the Web application will have access to the Web Part. However, if the Web Part definition is added to the Web Part Gallery, a special document library in the top - level site of a site collection, only the sites within that site collection will be able to add the Web Part to their pages.
In this post we will concentrate on deploying webpart only to BIN.
A) Manual Deployment
A.1: Add webpart assembly (<WebPartName>.dll) to Bin directory of web application
Web application path would be C:inetpubwwwrootwssVirtualDirectoriesPort_No
A.2: Add Safe control entry to web.config file of web application
Example.
<SafeControl Assembly="<WebPartName>" Namespace="<WebPartName>" TypeName="*" Safe="True" />
OR
<SafeControl Assembly="<WebPartName>, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" Namespace="<WebPartName>" TypeName="*" Safe="True" />
A.3: Add webpart to webpart gallery
Here we will not add any .webpart file to webpart gallery but this task will done by SharePoint itself. See how this is done.
Go to webpart gallery from "Site Actions". Click "New" and select your webpart assembly and populate it. This action actually create .webpart file for you webpart.
You can see this file content too. Click on "Edit" button in front of webpart in galley, then click "View XML" and save .webpart file. Open this file in notepad and see the xml markup.
A.4: Use webpart
Now open webpart page, edit it and put webpart in webpart zone.
B) Deployment by WSP package
B.1: Create solution for deployment
Create separate class library project in same solution which is totally a dummy project, we will not use it's assembly for deployment but it will help us to make deployment structure. Add one folder named "Defination" then copy your webpart assembly(DLL) there.
B.2: Create one text file and save it as manifest.xml, manifest file is actually a instruction file to STSADM utility which tells him where to place the files on server.
manifest.xml
<Solution xmlns='http://schemas.microsoft.com/sharepoint/' SolutionId='A54EF786-3131-4f6c-AF90-A7116DF2B814'>
<Assemblies>
<Assembly DeploymentTarget='WebApplication' Location='sandip.helloworldwebpart.dll'>
<SafeControls>
<SafeControl Assembly="sandip.helloworldwebpart" Namespace="sandip.helloworldwebpart" TypeName="*" Safe="True" />
</SafeControls>
</Assembly>
</Assemblies>
</Solution>
Above schema tells to STSADM that put my webpart assembly (sandip.helloworldwebpart.dll) into BIN folder of respective application and add safe control entry into web.config file of that application.
B.3: Create one text file and save it as inst.ddf, ddf(data definition file or diamond directive file) file is actually a instruction file to makecab utility which tells him how to create a package.
inst.ddf
.Set CabinetNameTemplate="sandiphellowworldwebpart.wsp" .set DiskDirectoryTemplate=CDROM ; All cabinets go in a single directory .Set CompressionType=MSZIP;** All files are compressed in cabinet files .Set MaxDiskFileCount=1000 ; Limit file count per cabinet .Set UniqueFiles='OFF' .Set Cabinet=on .Set DiskDirectory1="../Defination" manifest.xml sandip.helloworldwebpart.dll
Above schema tells to makebcab that create package of name “sandiphellowworldwebpart.wsp", put manifest file and assembly to root of
WSP package and save it into current directory.
WSP package and save it into current directory.
B.4: Create WSP package
Open command line and go to Defination folder of your deployment project
C:Documents and Settingssandip.patilMy DocumentsVisual Studio 2008ProjectsWSSsandip.helloworldwebpartDeploymentDefination>
and run this command
makecab /f inst.ddf
Now you will get package in same folder. To confirm files in WSP package, copy/paste package(.wsp) file on same directory and change extension to .cab. Open cab file and see 2 files (manifest.xml, sandip.helloworldwebpart.dll) should be there.
B.5: Create deployment/retraction file
Deployment file will add package to solution store and deploy to respective application.
Retraction file will retract solution (delete webpart from BIN and safe control from your web application) and delete solution from solution store.
Retraction file will retract solution (delete webpart from BIN and safe control from your web application) and delete solution from solution store.
DeploySolution.cmd
:begin @echo off set solutionName=sandiphellowworldwebpart set url=http://sandip:6666 @set PATH=C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12BIN;%PATH% echo --- Adding solution %solutionName% to solution store... stsadm -o addsolution -filename %solutionName%.wsp echo --- Deploying solution %solutionName%... stsadm -o deploysolution -name %solutionName%.wsp -url %url% -immediate -allowCasPolicies -force stsadm -o execadmsvcjobs if errorlevel == 0 echo ### Error deploying solution %solutionName% echo . goto end
RetractSolution.cmd
:begin @echo off set solutionName=sandiphellowworldwebpart set url=http://sandip:6666 @set PATH=C:Program FilesCommon FilesMicrosoft Sharedweb server extensions12BIN;%PATH% echo --- Attempting to deactivate/retract existing solution... stsadm -o retractsolution -name %solutionName%.wsp -url %url% -immediate stsadm -o execadmsvcjobs stsadm -o deletesolution -name %solutionName%.wsp -override rem stsadm -o execadmsvcjobs
B.6: Deploy solution package and confirm it
Double click DeploySolution.cmd and see webpart assembly(DLL) in your web application BIN and safe control entry in web.config too. You can see there is minor difference in safe control entry which is placed by there by STSADM and our manifest file entry.
<SafeControl Assembly="sandip.helloworldwebpart, Version=1.0.0.0, Culture=neutral, PublicKeyToken=48cc2196eaf8dbe7" Namespace="sandip.helloworldwebpart" TypeName="*" Safe="True" />
Don't worry about this change.
B.7: Add webpart to webpart gallery and use it.
When we deploy webpart using WSP package without feature, our .webpart file is placed into wpcatalog directory in the application.
When we deploy webpart using WSP package without feature, our .webpart file is placed into wpcatalog directory in the application.
Path could be C:inetpubwwwrootwssVirtualDirectoriesPort_No
This insure that our webpart will available in all site collections of the application and ready to use, Follow A.4 steps to use webpart on the pages.
B.8: (Optional)Retract solution package and confirm it
If you don't need this solution then retract it by running RetractSolution.cmd file.
Double click RetractSolution.cmd and see webpart assembly(DLL) in your web application BIN and safe control entry in web.config has been removed.
If you don't need this solution then retract it by running RetractSolution.cmd file.
Double click RetractSolution.cmd and see webpart assembly(DLL) in your web application BIN and safe control entry in web.config has been removed.
Thursday, December 30, 2010
Introduction to Webparts in Sharepoint
About WebParts
Not only could users easily modify the content and experience with the browser, but they could also modify pages for just their own experience, rather everyone ’ s shared experience. Web Parts became so popular that the ASP.NET team decided to add a Web Part Framework to ASP.NET 2.0. The ASP.NET 2.0 implementation is different from the WSS 2.0 implementation in that ASP.NET 2.0 adds a new component to the page: the WebPartManager . The WebPartManager control is responsible for managing all aspects of Web Parts on the page. It knows what Web Parts are allowed on the page, what Web Parts are already on the page and which Web Part zones they are in, any connections that have been established between two Web Parts, as well as the personalization data for each Web Part. Personalization data contains all the settings, or values, set on the public properties, for a Web Part. This is very different from the WSS 2.0 Web Part Framework in that each Web Part maintained its own connection and personalization information and Web Part zones managed which Web Parts were in each zone.
What happens when a Web Part is added to a Web Part zone?
containing the Web Part and the Web Part class itself. This XML also contains the values of the public
properties on the Web Part class.
<WebPart xmlns=”http://schemas.microsoft.com/WebPart/v2” xmlns:iwp=”http://schemas.microsoft.com/WebPart/v2/Image”>
<Assembly> Microsoft.SharePoint, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c </Assembly>
<TypeName> Microsoft.SharePoint.WebPartPages.ImageWebPart </TypeName>
<FrameType> None </FrameType>
<Title> Watch My Gears Run </Title>
<iwp:ImageLink> /_layouts/images/GEARS_AN.GIF </iwp:ImageLink>
</WebPart>
This XML, shown in above, is then stored as personalization information for a specific user (if the personalization scope is set to User) or for all users who access the page (if the personalization scope is set to Shared) depending on the mode of the page. The next time a page is requested, SharePoint loads the personalization information for the Web Part, which tells it which class to load from which assembly and the values of the public properties to set on that class. The Web Part is then loaded within the ASP.NET 2.0 page life cycle, which generates the rendered HTML output.
WebParts Base Classes
ASP.NET 2.0 — System.Web.UI.WebControls.WebParts.WebPart
WSS / SharePoint 3.0 — Microsoft.SharePoint.WebPartPages.WebPart
Why to use ASP.Net web part class not SharePoint web part class?
When creating new Web Parts, you have the option of creating Web Parts that inherit from System.Web.UI.WebControls.WebParts.WebPart (recommended) or Microsoft.SharePoint.WebPartPages.WebPart. The Windows SharePoint Services WebPart class exists primarily for the purpose of backward compatibility (Web Parts written for Windows SharePoint Services 2.0 continue to work in Windows SharePoint Services 3.0 without modification).
References
Professional SharePoint 2007 Web Content Management Development
Webpart Class
Friday, October 22, 2010
Break the variation in Sharepoint
Most of the Sharepoint Developers/Content Editors facing below problem in Variation feature of MOSS.
If below variation settings are ON.
Case is like this,
First time when we create page XYZ in source variation(English) this page will automatically get created on target variation site(French). Then content editor add some content to this page and publish it. That contents will also get reflected to target page but that is not in French because Sharepoint will not do the task of content translation. This time content editor edit content on French site and publish it.
Now everything is working fine till new change.
After some days there is one minor change in English site. Hence content editor do that change and publish it. Now disaster came into his life.
All the contents of French page get overwritten by English page.
Now we will talk about the workarounds.
1: Temporary solution
2: Permanent solution
Cheers! Now enjoy content editing.
Publishing a page in the variation source site overwrites all contents in the target site
If below variation settings are ON.
- Automatically create site and page variations
- Recreate a new target page when the source page is republished.
- Update Web Part changes to target pages when variation source page update is propagated.
Case is like this,
First time when we create page XYZ in source variation(English) this page will automatically get created on target variation site(French). Then content editor add some content to this page and publish it. That contents will also get reflected to target page but that is not in French because Sharepoint will not do the task of content translation. This time content editor edit content on French site and publish it.
Now everything is working fine till new change.
After some days there is one minor change in English site. Hence content editor do that change and publish it. Now disaster came into his life.
All the contents of French page get overwritten by English page.
Now we will talk about the workarounds.
1: Temporary solution
Go to the target page version history and restore current published major version.
2: Permanent solution
Attempt this once page created on first time. Delete target(French) page when it automatically created. Create new page with same name in target(French). This will break variation link between source and variation page. Add/Update the content and publish it.
By doing this you will see an error in Variation log
An error occurred during page variation creation. A page already exists at the target location:
Don't worry...! This error is coming because we breaked variation link. This will happen on every update on source page.
Cheers! Now enjoy content editing.
Saturday, August 21, 2010
Benefits of detaching publishing page from page layout
In the publishing feature of Sharepoint every page must be derived from the page layout. This page layout actually decide the look and feel plus contents of the page, so if u use one layout more than a page then it is difficult to manage the look and feel because if u make change in page layout then this changes are automatically reflected on all the pages which using this page layout.
Sharepoint designer has given one nice functionality to detach the page from it's layout. By detaching page from it's layout, page got a following benefits.
That's all here.
Sharepoint designer has given one nice functionality to detach the page from it's layout. By detaching page from it's layout, page got a following benefits.
- All the content fields and page fields can be used on the page.
- Use any designs templates to the page,this will not affect to other pages.
- Getting advantage of using DataView, FormView webparts etc.
That's all here.
Tuesday, February 9, 2010
List Tree View in Sharepoint
In one of our project there are more than 100 lists and every list is having nested folders as well as many items. My client don't want to dig the list to see all the nested folder inside it. So we decided to provide him the Tree View control which will show all the lists inside site and also show all the items/data inside a list and he can easily navigate to particular list/folder and item.
First we will show all the items/nested folder in TreeView
using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Utilities;
namespace Nishnat.ListTreeView
{
public class ListItems : WebControl
{
public string ListName { get; set; }
protected override void RenderContents(System.Web.UI.HtmlTextWriter writer)
{
// render the control
base.RenderContents(writer);
}
protected override void CreateChildControls()
{
base.CreateChildControls();
using (SPSite ospSite = new SPSite("http://localhost:7777/"))
{
using (SPWeb web = ospSite.RootWeb)
{
try
{
SPList list = web.Lists[ListName];
SPFolder rootFolder = list.RootFolder;
TreeView listTree = new TreeView();
listTree.ShowLines = true;
listTree.ExpandDepth = 0;
TreeNode rootNode = new TreeNode();
//Bind tree
MakeTreee(rootFolder, rootNode);
// add the root node to tree view
listTree.Nodes.Add(rootNode);
this.Controls.Add(listTree);
}
catch(Exception ex)
{
throw ex;
}
}
}
}
private void MakeTreee(SPFolder rootFolder, TreeNode rootNode)
{
SPQuery query = new SPQuery();
query.Folder = rootFolder;
SPWeb web = rootFolder.ParentWeb;
SPListItemCollection listColl = web.Lists[rootFolder.ParentListId].GetItems(query);
foreach (SPListItem subitem in listColl)
{
if (subitem.Folder != null) //Is folder
{
TreeNode childNode = new TreeNode(subitem.Folder.Name,subitem.ID.ToString(), "_layouts/images/folder.gif", subitem.Folder.ServerRelativeUrl, "");
rootNode.ChildNodes.Add(childNode);
MakeTreee(subitem.Folder, childNode);
}
else
{
string displayURL = GetDisplayUrl(subitem);
TreeNode childNode = new TreeNode(subitem.Name, subitem.Name, "", displayURL, "");
rootNode.ChildNodes.Add(childNode);
}
}
}
private static string GetDisplayUrl(SPListItem item)
{
SPList list = item.ParentList;
SPWeb web = list.ParentWeb;
string dispUrl = item.ContentType.DisplayFormUrl;
//dispUrl = String.Format("{0}/{1}?ID={2}", web, dispUrl, item.ID);
if (dispUrl == "")
dispUrl = list.Forms[PAGETYPE.PAGE_DISPLAYFORM].Url;
bool isLayouts = dispUrl.StartsWith("_layouts/", StringComparison.CurrentCultureIgnoreCase);
dispUrl = String.Format("{0}/{1}?ID={2}", web, dispUrl, item.ID);
if (isLayouts)
dispUrl = String.Format("{0}&List={1}", dispUrl, SPEncode.UrlEncode(list.ID + ""));
return dispUrl;
}
}
}
Second we will show all the Lists/items/nested folder in TreeView
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Collections.Generic;
using System.Text;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Utilities;
namespace Nishnat.ListTreeView
{
public class AllListsWithItems : WebControl
{
protected override void RenderContents(System.Web.UI.HtmlTextWriter writer)
{
// render the control
base.RenderContents(writer);
}
protected override void CreateChildControls()
{
base.CreateChildControls();
using (SPSite ospSite = new SPSite("http://localhost:7777/"))
{
using (SPWeb web = ospSite.RootWeb)
{
try
{
TreeView listTree = new TreeView();
listTree.ShowLines = true;
listTree.ExpandDepth = 0;
SPListCollection listAll = web.Lists;
foreach (SPList list in listAll)
{
SPFolder rootFolder = list.RootFolder;
TreeNode rootNode = new TreeNode(list.Title,list.ID.ToString(),list.ImageUrl,list.ParentWebUrl,"");
//Bind tree
MakeTreee(rootFolder, rootNode);
// add the root node to tree view
listTree.Nodes.Add(rootNode);
this.Controls.Add(listTree);
}
}
catch(Exception ex)
{
throw ex;
}
}
}
}
private void MakeTreee(SPFolder rootFolder, TreeNode rootNode)
{
SPQuery query = new SPQuery();
query.Folder = rootFolder;
SPWeb web = rootFolder.ParentWeb;
SPListItemCollection listColl = web.Lists[rootFolder.ParentListId].GetItems(query);
foreach (SPListItem subitem in listColl)
{
if (subitem.Folder != null) //Is folder
{
TreeNode childNode = new TreeNode(subitem.Folder.Name,subitem.ID.ToString(), "_layouts/images/folder.gif", subitem.Folder.ServerRelativeUrl, "");
rootNode.ChildNodes.Add(childNode);
MakeTreee(subitem.Folder, childNode);
}
else
{
string displayURL = GetDisplayUrl(subitem);
TreeNode childNode = new TreeNode(subitem.Name, subitem.Name, "", displayURL, "");
rootNode.ChildNodes.Add(childNode);
}
}
}
private static string GetDisplayUrl(SPListItem item)
{
SPList list = item.ParentList;
SPWeb web = list.ParentWeb;
string dispUrl = item.ContentType.DisplayFormUrl;
//dispUrl = String.Format("{0}/{1}?ID={2}", web, dispUrl, item.ID);
if (dispUrl == "")
dispUrl = list.Forms[PAGETYPE.PAGE_DISPLAYFORM].Url;
bool isLayouts = dispUrl.StartsWith("_layouts/", StringComparison.CurrentCultureIgnoreCase);
dispUrl = String.Format("{0}/{1}?ID={2}", web, dispUrl, item.ID);
if (isLayouts)
dispUrl = String.Format("{0}&List={1}", dispUrl, SPEncode.UrlEncode(list.ID + ""));
return dispUrl;
}
}
}
* Add assembly into GAC and Bin application
* Register the control on the page
<@ Register Tagprefix="Nishnat" Namespace="Nishnat.ListTreeView" Assembly="Nishnat.ListTreeView, Version=1.0.0.0, Culture=neutral, PublicKeyToken=57c7737278844f55">
* Now Use it on the page
<Nishnat:ListItems Id="listItems" runat="server" ListName="Books">
</Nishnat:ListItems>
<Nishnat:AllListsWithItems Id="AllListsWithItems" runat="server">
</Nishnat:AllListsWithItems>
Subscribe to:
Posts (Atom)
