madhurahuja.blogspot.com Open in urlscan Pro
142.250.186.33  Public Scan

Submitted URL: http://www.madhurahuja.blogspot.com//
Effective URL: https://madhurahuja.blogspot.com/
Submission: On October 02 via api from US — Scanned from DE

Form analysis 0 forms found in the DOM

Text Content

skip to main | skip to sidebar


CODE, ARTICLES, DISCUSSION ON MICROSOFT TECHNOLOGIES

The learnings on technologies I work upon ...


SATURDAY, MARCH 29, 2008


I HAVE MOVED TO HTTP://BLOGS.MSDN.COM/MAHUJA



From now on, all new posts will be posted on my "new" MSDN blog
http://blogs.msdn.com/mahuja.

Please update your feeds.



Posted by Madhur at 5:50 PM 6 comments  






SATURDAY, MARCH 01, 2008


SWITCH THE SHAREPOINT WEBPART PAGE DISPLAY MODE INTO EDIT MODE AND VICE VERSA







INTRODUCTION


Recently one of my clients had a requirement to go into Edit mode of a
sharepoint page using a manual link displayed in quick launch. He was lazy of
going to Site Actions -> Edit Page and then again going somewhere else for Exit
Edit Mode :)



To give some background for beginners, whenever we click Edit Page on Site
Actions menu,
the pages switches into a different display mode called Design Mode. Its not a
feature of
Sharepoint, but ASP.NET 2.0 Webparts Framework.




BACKGROUND


According to the framework, the page can have 4 different modes:

   
   
 * BrowseDisplayMode : Represents the default display mode.
   
 * CatalogDisplayMode : Used for adding controls from a catalog of controls to a
   Web page
   
 * ConnectDisplayMode : Displays a special UI for users to manage connections
   between Web Part controls.
   
 * DesignDisplayMode : Used for changing the layout of Web pages containing Web
   Part controls.
   
 * EditDisplayMode : Displays a UI from which end users can edit and modify
   server controls
   
   

The WebPartManager control provides a programmatic interface, making it possible
to switch the Web Part Page between browse, design, and edit display modes.


For example, to programmatically switch the current page into design mode, you
can simply add a link control with an event handler that sets the DisplayMode
property to DesignDisplayMode.



WebPartManager1.DisplayMode = WebPartManager.DesignDisplayMode;


Although this would work technically, but it would not give up the visible
changes to page, like visibilty of Page Editing toolbar, webpart zones etc.


This visual magic is done by lot of Javascript which is executed when we click
Edit Page on Site Actions menu.

To build this link control, we need to figure out the javascript code which
causes this behaviour.



This would be present in default.master. If we open Site Actions menu and do the
View Source on IE.
Here is the code of our interest :



<td class="ms-siteactionsmenu" id="siteactiontd">
<span><a href="javascript:MSOLayout_ToggleLayoutMode();">Edit Page</a></span>


As you must have figured out, its the MSOLayout_ToggleLayoutMode() function
which does all the magic of turning the current page into Edit page. This
javascript also calls the server side code which executes this statement



WebPartManager1.DisplayMode = WebPartManager.DesignDisplayMode;
//(This can also be demonstrated, but its beyond scope)




BUILDING THE WEBCONTROL

Armed with this knowledge, we can build a simple webcontrol which we will switch
the page into Edit mode and vice versa.
Below is the code for the same. Its the simplest webcontrol you will see ever.



using System;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Web.UI;
namespace SPUtil
{
public class SPEditMode:System.Web.UI.WebControls.WebControl
{
  HtmlAnchor btnLink;

  protected override void CreateChildControls()
  {
      WebPartManager wp = WebPartManager.GetCurrentWebPartManager(Page);

      const string url="javascript:MSOLayout_ToggleLayoutMode();";

      btnLink = new HtmlAnchor();

      if (wp.DisplayMode == WebPartManager.BrowseDisplayMode)

          btnLink.InnerText = "Edit Page";
      else if (wp.DisplayMode == WebPartManager.DesignDisplayMode)
          btnLink.InnerText = "Exit Edit Mode";
      else
          btnLink.Visible = false;

      btnLink.HRef = url;

      Controls.Add(btnLink);
      base.CreateChildControls();
  }

}
}



I have used HtmlAnchor rather than LinkButton or SPLinkButton since its
lightweight on the server and We are not performing any special processing which
is present in server controls.

One point to be worth noting: This link would be visible to all including
visitors. For used in practical scenarious, the control should be hidden for
other than members and Administrators.

I was using this link in user's MySite and hence I did not have that case :)







Posted by Madhur at 7:43 PM 1 comments  






SATURDAY, FEBRUARY 23, 2008


PASSING MULTIPLE FILTER VALUES TO EWA PIVOT TABLE FILTER CELL



Filter webparts in WSS are a great way to provide filtering in many different
webparts like List View, Business Data Catalog, Excel Web Access etc.



They are also great way to provide data view personalization when used with
Excel services coupled with Analysis Services of SQL server.

This is described in detail on Excel Team blog here


In this post, we will see how to create a simple filter webart which provides
values to pivot table filter cell.


I am mentioning pivot table filter cell exclusively because the filter webpart
examples on MSDN has to be slightly modified to provide values
to filter cell.


Basically, we are building a filter provider which


   
   
 * Implements the ITransformableFilterValues interface.
   
   
 * The interface required few properties to be overridden, the most important of
   them is public virtual ReadOnlyCollection<string> ParameterValues.
   This parameter contains read only collection of strings which are passed to
   the consumer webpart.
   
   
 * The webpart returns the instance of itself through a public method
   SetConnectionInterface()
   


using System;
using System.Collections.Generic;
using System.Web.UI;
using System.Web.UI.WebControls;
using aspnetwebparts = System.Web.UI.WebControls.WebParts;
using wsswebparts = Microsoft.SharePoint.WebPartPages;
using System.Collections.ObjectModel;

namespace ExcelFilters
{
public class ExcelFilters : aspnetwebparts.WebPart, wsswebparts.ITransformableFilterValues
{
CheckBoxList cblRegionList;
ListItem cbitemRegion;
string[] countries = new string[]
{ "Canada", "Central America", "Mexico", "South America", "United States",
 "Albania", "Andora", "Austria", "Aizerbejan", "Belarus", "belgium",
  "Bosnia and Hersegovina", "Bulgaria" };

public virtual bool AllowMultipleValues
{
   get
   {
       return false;
   }
}
public virtual bool AllowAllValue
{
   get
   {
       return true;
   }
}

public virtual bool AllowEmptyValue
{
   get
   {
       return false;
   }
}
public virtual string ParameterName
{
   get
   {
       return "Geography";
   }
}

public virtual ReadOnlyCollection ParameterValues
{
   get
   {
       string[] values = this.GetCurrentlySelectedGeographies();      
       List param=new List();

       foreach (string str in values)
       {
           if(!string.IsNullOrEmpty(str))
               param.Add(str);
       }
       return values == null ?null :new ReadOnlyCollection(param);
   }
}

protected override void CreateChildControls()
{
   cblRegionList = new CheckBoxList();
   cblRegionList.AutoPostBack = true;
   Controls.Add(cblRegionList);

   foreach (string region in countries)
   {
       cbitemRegion = new ListItem();
       cbitemRegion.Text = region;
       cblRegionList.Items.Add(cbitemRegion);
       cbitemRegion = null;
   }

   base.CreateChildControls();
}

[aspnetwebparts.ConnectionProvider("Region Filter", "ITransformableFilterValues", AllowsMultipleConnections = true)]
public wsswebparts.ITransformableFilterValues SetConnectionInterface()
{
   return this;
}

public string[] GetCurrentlySelectedGeographies()
{
   String[] choices = new String[countries.Length];
   bool anythingSelected = false;

   for (int i = 0; i < cblRegionList.Items.Count; i++)
           {
               if (cblRegionList.Items[i].Selected)
               {
                   anythingSelected = true;
                   choices[i] = cblRegionList.Items[i].Text;
               }

           }
           if (!anythingSelected)
               choices = null;

           return choices;
       }

       protected override void RenderContents(HtmlTextWriter output)
       {
           this.EnsureChildControls();
           RenderChildren(output);

       }
   }
}


Now, rather than explaining the simple webpart, which is already explained by
Microsoft, I will point out key points which differentiates it from the examples
at many places.

If we notice GetCurrentlySelectedGeographies() method, it returns the string
array of selected geographies. However, the length of this string array is
constant and is equal to number of selectable items, which causes the other
items in string array to become null.

In the MSDN example here the string array is directly passed by converting it to
ReadOnlyCollection of strings. This will not work since it includes the null
items
in the array as well.


string[] values = this.GetCurrentlySelectedGeographies();
return values == null ?null :new ReadOnlyCollection(values);


Pivot table Report filter cell, expects a Collection of values only which are
selected. Thus we need to modify the code as follows



string[] values = this.GetCurrentlySelectedGeographies();      
List param=new List();
foreach (string str in values)
{
 if(!string.IsNullOrEmpty(str))
 param.Add(str);
}
return values == null ? null :new ReadOnlyCollection(param);


This code snippets, creates a new List which includes all the string objects
except the null items from the original string array which is returned by
GetCurrentlySelectedGeographies()






Posted by Madhur at 10:18 AM 4 comments  






SUNDAY, FEBRUARY 10, 2008


IMPLEMENTATION OF LOGGING AND INSTRUMENTATION APPLICATION BLOCK IN MOSS 2007



Continuing the series of articles on Enterprise Library, I have written the
first article
on the implementation of Logging Application Block in MOSS 2007. Due to
inclusion of formatted code and images, I have directly uploaded this on
Codeproject.

The article can be viewed here



Posted by Madhur at 11:43 AM 0 comments  






SUNDAY, FEBRUARY 03, 2008


MICROSOFT ENTERPRISE LIBRARY - USING DESIGN PATTERNS AND BEST PRACTICES WITH
SHAREPOINT 2007 DEVELOPMENT



Patterns and Practices Group within Microsoft has provided developers with
useful code libraries in form of Enterprise Library which solve the common
programming tasks and provide the developers with best practices.



The patterns & practices Enterprise Library is a library of application blocks
designed to assist developers with common enterprise development challenges.
Application blocks are a type of guidance, provided as source code that can be
used "as is," extended, or modified by developers to use on enterprise
development projects.



Note: The purpose of this article is introduction of Microsoft Enterprise
library. I would cover each specific application block in subsequent blog
articles and demonstrate how they can be effectively used in Sharepoint 2007
development environment.



The seven application blocks are:


 * Caching Application Block - allows developers to incorporate a local cache in
   their applications.
 * Configuration Application Block - allows developers to read and write
   configuration information.
 * Data Access Application Block - allows developers to incorporate standard
   database functionality in their applications
 * Cryptography Application Block - allows developers to include encryption and
   hashing functionality in their applications.
 * Exception Handling Application Block - allows developers and policy makers to
   create a consistent strategy for processing exceptions that occur throughout
   the architectural layers of enterprise applications.
 * Logging and Instrumentation Application Block - allows developers to
   incorporate standard logging and instrumentation functionality in their
   applications.
 * Security Application Block - allows developers to incorporate security
   functionality in their applications.
   

Each of the application blocks uses similar design patterns and share similar
deployment and configuration requirements.



Getting Started with Enterprise Library



In order to get rolling with the Enterprise Library you'll first need to
download the library from Microsoft's site. The download is a near 9 MB file,
which includes the complete Enterprise Library application block source code,
Quick Start examples, off-line documentation, and the GUI tool.



During this installation process you can specify what application blocks to
install, if you only want to install a subset of the seven. Upon completion of
the installation, the files should be in the \Program Files\Microsoft Enterprise
Library folder.










Posted by Madhur at 7:30 AM 1 comments  






SATURDAY, JANUARY 26, 2008


RSS READER WEBPART WITH TAB SUPPORT AND ASYNCHRONOUS PERIODIC DATA REFRESH USING
AJAX



I have recently written my first article on Codeproject.

The article describes the development of AJAX enabled webpart on MOSS 2007 SP1.

The cool thing about it is the that it also utilizes the AJAX Control Toolkit
including programmatically adding and styling TabContainer and TabPanel controls
which can be quite tricky for a beginner. The article can be found here:
http://www.codeproject.com/KB/sharepoint/RssReaderAjax.aspx





Posted by Madhur at 9:39 PM 0 comments  






SUNDAY, JANUARY 20, 2008


GET RSS URL FOR A LIST OR DOCUMENT LIBRARY PROGRAMMATICALLY



Recently I developed an RSS Reader webpart which would take the RSS URL of list
to render its feeds. Very much same like the out of the box webpart with the
exception that it was AJAX enabled. I would post the details of that part on the
blog when I am finished.






An idea came to me that wouldn’t it be nice to also enable users to just give
the list URL rather than RSS URL since would reduce the few steps on the user’s
side. I thought it would be just a matter of accessing the RssUrl property of
SPList object, but to my surprise it was not to be. There is no property such
property in the API, so I decided to write my own function for it.






Let’s analyze the RSS URL of a list or a library. Whenever the user clicks on
View RSS feed on a library, here is how SharePoint constructs the URL:






http://<server>/<site>/_layouts/listfeed.aspx?List=%7B14206B18%2DF68F%2D479B%2DBC84%2D15EE48D19D7D%7D






Listfeed.aspx is the inbuilt RSS viewer of sharepoint which accepts a parameter
which is the GUID of the list. %2D tokens refer to ‘-‘characters which exist
inside the GUID. Considering all this, it’s easy to write a function which will
return the RSS URL. Here is the code for the same:






private string MakeRssUrl(string rawurl)

{

try

{

Uri url = new Uri(rawurl, UriKind.Absolute);



if (url.GetLeftPart(UriPartial.Path).Contains(“_layouts/listfeed.aspx”))

{

return rawurl;

}

else

{

string rssurl;

using (SPWeb web = new SPSite(rawurl).OpenWeb())

{

SPList list = web.GetListFromUrl(rawurl);

rssurl = web.Url + "/_layouts/listfeed.aspx?list=" + list.ID;

return rssurl;



}



}

}

catch (UriFormatException e)

{

return string.Empty;

}



}






The code is pretty self explanatory. The argument to function is list URL or RSS
url. We first check if the URL is RSS URL itself, and if it is we just return.
Otherwise, if it’s a list URL, we create a SPList instance, grap the GUID and
contatenate it with the site URL and listfeed.aspx.







Note that the function does not validate if the given URL was actually a valid
list URL or not. The exception handling for that case should be left to the
caller of the function.







Posted by Madhur at 11:30 PM 1 comments  





Older Posts Home

Subscribe to: Posts (Atom)


THIS BLOG IS NO LONGER MAINTANED

I am no longer maintaing this blog. For new posts, please refer to
https://docs.microsoft.com/en-in/archive/blogs/mahuja/


OR my complete new blog hosted on jekyll at:
http://madhur.co.in/blog






AUTHOR

Madhur Bengaluru, India I was working on Sharpoint 2007 as a
developer/consultant. Currently, I work on open source technologies. View my
complete profile






RECENT POSTS

 * I have moved to http://blogs.msdn.com/mahuja - 29.3.2008
 * Switch the sharepoint webpart page Display Mode into Edit Mode and Vice
   Versa - 1.3.2008
 * Passing multiple filter values to EWA pivot table filter cell - 23.2.2008
 * Implementation of Logging and Instrumentation Application Block in MOSS
   2007 - 10.2.2008
 * Microsoft Enterprise Library - Using Design Patterns and Best Practices with
   Sharepoint 2007 development - 3.2.2008




MY FAVOURITE LINKS

 * My Shared Feeds




BLOG ARCHIVE

 * ▼  2008 (10)
   * ▼  March (2)
     * I have moved to http://blogs.msdn.com/mahuja
     * Switch the sharepoint webpart page Display Mode in...
   * ►  February (3)
   * ►  January (5)

 * ►  2007 (13)
   * ►  December (2)
   * ►  November (1)
   * ►  August (1)
   * ►  July (2)
   * ►  May (2)
   * ►  February (2)
   * ►  January (3)

 * ►  2006 (18)
   * ►  December (2)
   * ►  November (2)
   * ►  October (2)
   * ►  September (2)
   * ►  August (1)
   * ►  July (5)
   * ►  June (4)

 * ►  2005 (1)
   * ►  December (1)



 

Diese Website verwendet Cookies von Google, um Dienste anzubieten und Zugriffe
zu analysieren. Deine IP-Adresse und dein User-Agent werden zusammen mit
Messwerten zur Leistung und Sicherheit für Google freigegeben. So können
Nutzungsstatistiken generiert, Missbrauchsfälle erkannt und behoben und die
Qualität des Dienstes gewährleistet werden.Weitere InformationenOk