Tuesday, December 28, 2010

Add Additional Column to SharePoint 2010 Programmatically

When worked in project I faced problem in adding additional lookup column to list programmatically and I didn't found any article to guide me of doing it. After investigation I found the solution.
Example I have Lookup 2 lists:

  1. Countries with 2 text columns Title as key and Code.
  2. Application have lookup with name CountryTitle

I want to add Code Column of Countries list as additional column of look CountryTitle. The Code below do this action:


string mainListName = "Countries"; //Name of Lookup List
string lookupListName = "Application"; //Name of Main List Needs to add additional field to lookup
string lookupColAdditionalFieldDisplayName = "CountryCode"; //Display name of additional field in main list
string pLookupKeyName = "CountryTitle"; //Name of parent lookup field in main List
string additionalLookupFieldName = "Code"; //Name of additional Field in lookup list
//Main List
SPList mainlst = w.Lists[lookupListName];

//Lookup List
SPList lookuplst = w.Lists[mainListName];

//Main List Fields
SPFieldCollection col = mainlst.Fields;

//Lookup Primary Key
SPFieldLookup spPrimaryField = ((SPFieldLookup)col[pLookupKeyName]);

//Create Additional Field its name in lookup Field1 with display name in list TestDisplayName
SPFieldLookup field = (SPFieldLookup)mainlst.Fields.CreateNewField(SPFieldType.Lookup.ToString(), lookupColAdditionalFieldDisplayName);
field.LookupList = spPrimaryField.LookupList;
field.LookupWebId = spPrimaryField.LookupWebId;
field.LookupField = additionalLookupFieldName;
field.PrimaryFieldId = spPrimaryField.Id.ToString();
field.ReadOnlyField = true;
field.AllowMultipleValues = spPrimaryField.AllowMultipleValues;
field.UnlimitedLengthInDocumentLibrary = spPrimaryField.UnlimitedLengthInDocumentLibrary;
field.Direction = spPrimaryField.Direction;
SPAddFieldOptions op = SPAddFieldOptions.Default;

//Add Additional Field to main list
mainlst.Fields.AddFieldAsXml(field.SchemaXml, true, op);

Thursday, June 3, 2010

"Upload Multiple Documents" option is missing in IE

if you found "Upload Multiple Documents" option is missing in IE do the following steps:

1) Browse to your website at http:///_layouts/settings.aspx; you will need to login by providing a service account name & password or your site collection administrator account & password.

2) Once you login, click on 'Site Actions' menu.

3) Then, click on 'Manage Site Content and Structure'.

4) Click on any document library you want to upload or add files into. If you do not see the 'Upload' menu from the dropdown main menu between the 'New' and 'Actions' menu then you have this bug as well showing up on your server. Don't give up yet, there is a solution. Keep going through these steps!

5) Click on 'New' and select 'Item'.

6) You should now see the Upload Document page; under the input browse field there should be a link for 'Upload Multiple Files...', if you do not see this you will need to install either Office 2003 or Office 2007. If you do see it, click on it.

7) Now, you should see the multiple upload page that allows you to select multiple files. If you try to select one or several and click on the OK button, nothing will happen. No need to worry! There is a work around. Just keep reading to the next step.

8) On the hierarchy navigation you will have links something like this:

WebSiteName > Folder1 > Folder2

9) Click on the "Document Library" folder name; in our case it was Folder1. Basically its the folder you ended up in in step #4.

10) Now, did you notice anyting in your menu change? Now you should be able to see the Upload menu option between the 'New' and 'Actions' menu that you could not see in step #4.

11) Click on the 'Upload' menu and select 'Upload Multiple Documents'

12) Now, you will be back at the Upload document page where you were in step #7

13) Select one file or many and then click OK. Now it works!!! You should get an IE popup asking you that your about to upload files to your site, Click OK.

Saturday, March 13, 2010

Moss 2007 Site Action -> Site Settings have disappeared

For some unknown reason for the admin user of our Moss site (and all other users who had full control permissions) the Site Action -> Site Settings menu option have disappeared from the home page. I can navigate to it by going to mysite/_layouts/settings.aspx but I can't change anything it says I do not have permissions.

IF the user logged IS the Site Collection administrator and still gets theses access denied messages, your Content Database seems to be locked. This happens during backups or when backups go wrong (get interrupted for example)
stsadm -o getsitelock -url http://server_name

if it is not showing as 'none', it is locked. fix command:
stsadm -o setsitelock -url http://server%5Fname -lock none

Thursday, March 11, 2010

How to change the Maximum File Upload Size

When a custom master page is applied, editing a list in Datasheet View causes IE to just hang. I found this script hich solved my problem:
<script type="text/javascript">

function GCComputeSizing(GCObject)
{
if (TestGCObject(GCObject))
{
var fBIDI=(document.documentElement.currentStyle.direction=="rtl");
var lGCWindowWidth=document.documentElement.scrollWidth;
var lGCWindowHeight=(document.documentElement.scrollHeight>document.documentElement.clientHeight) ? document.documentElement.clientHeight : document.documentElement.scrollHeight;

var lGCObjectOffsetLeft=0;
var lGCObjectOffsetTop=0;
if (fBIDI)
{
lGCObjectOffsetLeft=-180;
lGCObjectOffsetTop=120;
}
else
{
lGCObjectOffsetLeft=32;
lGCObjectOffsetTop=-2;
}
var lGCObjectWalker=GCObject.parentElement;
while (lGCObjectWalker !=document.body)
{
lGCObjectOffsetLeft+=lGCObjectWalker.offsetLeft;
lGCObjectOffsetTop+=lGCObjectWalker.offsetTop;
lGCObjectWalker=lGCObjectWalker.offsetParent;
if (fBIDI)
if (lGCObjectWalker.offsetLeft > 0)
break;
}
lGCObjectOffsetLeft+=GCObject.parentElement.offsetLeft;
lGCObjectOffsetTop+=GCObject.parentElement.offsetTop;
glGCObjectHeight=lGCWindowHeight - lGCObjectOffsetTop;
if (glGCObjectHeight > lGCWindowHeight)
glGCObjectHeight=lGCWindowHeight
if (glGCObjectHeight < cGCMinimumHeight)f
glGCObjectHeight=cGCMinimumHeight;
if (fBIDI)
{
glGCObjectWidth=lGCWindowWidth+lGCObjectOffsetLeft;
}
else
glGCObjectWidth=lGCWindowWidth - lGCObjectOffsetLeft;
if (glGCObjectWidth > lGCWindowWidth)
glGCObjectWidth=lGCWindowWidth;
if (glGCObjectWidth < cGCMinimumWidth)
glGCObjectWidth=cGCMinimumWidth;
}
}

</script>
place it after core.js in your master page.

How to change the Maximum File Upload Size

By default SharePoint allows a maximum file size of 50MB that can be uploaded into any document library. This might be too much as you might not want users downloading 50MB files over your LAN/WAN. To change the maximum file size
1. Goto SharePoint Central Administration > Configure Virtual Server Settings from Virtual Server List Page.
2. Select your server
3. Goto Virtual Server General Settings (in Virtual Server Management)
4. Change the value of the Maximum Upload Size in MB's.

If you increase the file size limit, your site might occassionally time out for users while they are uploading files. To accomodate this increase the default time out property for IIS.

Tuesday, February 23, 2010

DiscussionBoard ListView in onet.xml

When tried to create site definition and added ListView for DiscussionForum. Link of added Item redirected to the default Web page for the site intead of open.
<View List="Discussion Forums"
WebPartZoneID="Left" BaseViewID="0" WebPartOrder="3" Type="HTML" RowLimit="5"
/>

After investigation I found error occur if the XML parser cannot find a matching content type ID.

Solution:
add the ContentTypeID attribute together with the content type value "0x012001" to the View element code of the discussion Web part in the Onet.xml file:
<View List="Discussion Forums" ContentTypeID="0x012001"
WebPartZoneID="Left" BaseViewID="0" WebPartOrder="3" Type="HTML" RowLimit="5"
/>

Tuesday, May 26, 2009

MOSS 2007 Content Type Field Authorization

In MOSS 2007 you have authorization control over an entire content type, but not over a single field or combination of fields. This requirement comes up often with some of my clients, so I decided to whip up a quick authorization container control that could be wrapped around fields in a page layout to control who has access to the fields. This will work both for content editing and for content viewing.

First you need to create a custom ASP.NET control that can act as a container. While this is fairly easy, one item that often catches people unaware is the ParseChildren attribute. You need to set the ParseChildren to "false" in order for the custom ASP.NET control to interpret nested tags as separate controls rather than as properties. Setting the ParseChildren attribute to "true" will cause the control to think that the nested tags contain values that should be set to the matching properties of the control.

The complete code for the finished control is listed below:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Text;

using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Microsoft.SharePoint;
using Microsoft.SharePoint.WebControls;

namespace MyCompany.SharePoint
{
[DefaultProperty("Groups")]
[ParseChildren(false)]
[ToolboxData("<{0}:AuthorizationContainer runat=server>")]
public class AuthorizationContainer : CompositeControl
{
private const string groupsCategory = "SharePoint";
private const string groupsViewState = "Groups";

[Bindable(false)]
[Category(groupsCategory)]
[DefaultValue("")]

[Localizable(false)]
public string Groups
{
get
{
string groups = (string)ViewState[groupsViewState];
if (groups == null)
{
groups = string.Empty;
}
return groups;
}
set
{
ViewState[groupsViewState] = value;
}
}

protected override void RenderContents(HtmlTextWriter output)
{
try
{
SPWeb web = SPControl.GetContextWeb(this.Context);
SPUser user = web.CurrentUser;
bool isInGroup = false;

if (!string.IsNullOrEmpty(this.Groups))
{
string[] items = this.Groups.Split(',');
foreach (string item in items)
{
if (this.IsInGroup(user, item.Trim()))
{
isInGroup = true;
break;
}
}
}
else
{
isInGroup = true;
}

if (isInGroup)
{
base.RenderContents(output);
}
}
catch (Exception ex)
{
output.WriteLine(ex.Message);
}
}

private bool IsInGroup(SPUser user, string name)
{
foreach (SPGroup group in user.Groups)
{
if (group.Name == name) return true;
}
return false;
}
}
}

As you can see the code is fairly simple. There is a property for setting the comma separated list of SharePoint group names that are authorized to view the content of the control, and a render method that checks to make sure that the current user is a member of one of the specified groups.
Using this new control to filter authorized users is super easy. Open up the page you want to edit in SharePoint Designer and edit the page layout of the page. The page layout will contain placeholder controls for the content type fields. Wrap the new AuthorizationContainer around the sections that you want to control. An example of this is listed below.

<MyControls:AuthorizationContainer runat="server" Groups="Approvers">
<table id="MSO_ContentTable" cellpadding="0" cellspacing="0" border="0" width="100%">
<tr> <td>
<div class="pageContent">
<PublishingWebControls:RichHtmlField id="content" FieldName="PublishingPageContent" runat="server"/>
</div>
</td>
</tr>
</table>
</MyControls:AuthorizationContainer>

While this code sample is simple in nature, you could extend it in many ways. It could filter authorization by audience membership or by custom logic based on database stored values. Feel free to turn it into whatever you want, just make sure to share the goods with me.