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

Sunday, February 8, 2015

SOLVED: SharePoint Designer Inserting Blank Lines

Frustrated by Designer adding unwanted blank lines to your .aspx or .master pages?

Here's the problem:


The first time the file is saved in SharePoint Designer blank lines are inserted or added like this...




The second time the file is saved Designer doubles the number of blank lines, plus adds an extra line - a total of three blank lines...






The third time the file is saved it doubles again, adding one line for a total of seven blank lines...





The fourth time the file is saved a total of fifteen blank lines appear (double previous plus one)....

It's simple to see how after several iterations of changes hundreds or thousand of unwanted blank lines can be inserted.





Notice the culprit here - it occurs around lines of literal text within tag-blocks...

Where ever you encounter <SharePoint:ScriptBlock> and <SharePoint:StyleBlock> tags you will experience this problem:
   

Here's the fix (read all the way to the end):

Simply add an HTML/XML comment tag right after Script or Style Tags.  Like this...


...and that's it.  Fixed.  Save as many times as you want - no more blank lines inserted between these tags.

Crucial Tips!

  • Notice that the comment tag must be on the same line as the <SharePoint:...block> tag. Must!  If you put it on it's own line the problem will persist
  • Adding this text is necessary for every <SharePoint:...block> tag on the page.



Monday, April 7, 2014

How to relocate the page-advance-control displayed at the botton of the list view

In your SharePoint list view you want to accomplish this...

It's simple to do - modify your custom-master-page (BTW the best practice is to NOT edit "default.master" but always use your own custom-master-page - Google how to create a custom master if you are not familiar with this)

If you are working in Visual Studio (creating a site for deployment) locate and open your custom-master-page in the "Modules" folder in Solution Explorer...

Or if using SharePoint Designer, open your site and locate your custom-master-page in the "Master Page" folder...

Once your custom master page is open locate </head> (the closing head tag) and just above it paste the following code...

     <style type="text/css">
          #bottomPagingCellWPQ2 {text-align: left;}
     </style>

Once added the code (in the larger context of the code block) should look something like this...

Save and deploy (from visual studio) Or Save and Check-in (SharePoint Designer). Refresh your site and now the page-advance-control is located to left in the list view.

If you need to document what you've just accomplished: "Updated the master page to include an inline style that overrides the "text-align" attribute from "center" to "left" on the "bottomPagingCellWPQ2" (id) table-data-cell  (which is where the list-view page advance control is located)."

Users you are developing for, who have list views with many columns, will thoroughly appreciate this enhancement.  Moving the page-advance-control to a handy spot will keep them from continually scrolling to the middle of each new page.

Friday, October 12, 2012

SharePoint and XSLT 1.0 - How to compare dates

==============================================================
UPDATE: Be aware that Microsofts's XSLT library date_templates.xsl contains a minor bug.
Using the "getDateFromDays" template will return NaN (not-a-number) when attempting to calculate the last day of the year (12/31).  All other days calculate correctly.
==============================================================
When it comes to performing date comparisons and calculations in SharePoint using XSLT 1.0 can be tricky, but here's a simple way

Navigate out to this document library
http://YourSite/Style%20Library/Forms/AllItems.aspx

And click on the "XSL Style Sheets" link
Microsoft has created an XSLT file with many handy templates for doing date calculations.
Download this Microsoft XSLT file date_templates.xsl and add it to the "XSL Style Sheets" folder.
Now locate the "ItemStyle.xsl" file and check it out for editing.  Add these styling blocks within the item you wish to transform

<!-- This is an example using the MS date_templates templates -->
<!-- Here it's calculating the date of tomorrow -->
<xsl:variable name="tomorrow">
  <xsl:call-template name="getDateFromDays">
  <!-- This template requires the date in the ISO format -->
  <xsl:with-param name="paramBaseDate" select="ddwrt:TodayIso()"/>
  <xsl:with-param name="paramDelta" select="1"/>
  </xsl:call-template>
</xsl:variable>

<!-- 1st step in date comparisons in XSLT 1.0 is to convert dates to numbers.  Stripping the dashes from an ISO date converts '2012-10-10' to the number '20121010' -->

<xsl:variable name="tomorrowAsNumber" select="(translate($tomorrow,'-',''))" />

<!-- The Content Query Web Part is returning a list of tasks that contain a field called "Due Date"
<xsl:variable name="listOfTasks" select="/dsQueryResponse/Rows/Row" />

<!-- Count the number of "Tasks Due Now" by converting the "Due Date" criteria to a number and comparing it to the "Tomorrow Number" using "less-than" -->
<xsl:variable name="countOfTasksDueNow" select="count($listOfTasks[translate(substring(@DueDate,1,10),'-','') &lt; $tomorrowAsNumber])" />

<!-- Count the number of "Tasks Due Tomorrow" by converting the "Due Date" criteria to a number and comparing it to the "Tomorrow Number" using "equals" -->
<xsl:variable name="countOfTasksDueTomorrow" select="count($listOfTasks[translate(substring(@DueDate,1,10),'-','') = $tomorrowAsNumber])" />

<!-- Count the number of "Future Tasks Due" by converting the "Due Date" criteria to a number and comparing it to the "Tomorrow Number" using "greater-than" -->

<xsl:variable name="countOfFutureTasks" select="count($listOfTasks[translate(substring(@DueDate,1,10),'-','') &gt; $tomorrowAsNumber])" />


SharePoint & Linq: More with less

Linq makes it easy to navigate thru a record set object of SharePoint List items.

// Using Statement

using System.Linq;

// Build the Query Object
SPQuery queryObject = new SPQuery();
queryObject.Query = 

@"<where>
   <contains>
      <fieldref name="FirstName">
         <value type="Text">Bob</value>
      </fieldref>
   </contains>
</where>
<orderby>
   <fieldref ascending="TRUE" name="Modified">
   </fieldref>
</orderby>";
Now, here's where the magic starts
Super Linq! -  Retrieving list items with a single line of code!

var results = list.GetItems(queryObject).Cast<splistitem>();


// Here's how to see if any records were returned
if (!results.Count().Equals(0))

// Want just the Last record?

var resultItem = list.GetItems(queryObject).Cast<SPListItem>().Last();

// Want just the First record?
var resultItem = list.GetItems(queryObject).Cast<SPListItem>().First();

Thursday, February 23, 2012

Comparing Fields to See if Values Have Changed in the ItemUpdating Method

You cannot get information about what was before the event in the '-ed' EventReceiver, only in the '-ing'.

So, within the public override void ItemUpdating(SPItemEventProperties properties) method...

- The "before" updating value is obtained like this;
var beforeValue = properties.ListItem["Column Name"].ToString();

- The "after" updating value is obtained like this;
var afterValue = properties.AfterProperties[properties.ListItem.Fields["Column Name"].InternalName];

Before making a beforeValue == afterValue comparison you may need to type check these values.

Changing the "Created By" Value in a SharePoint List Item

C#


// Where "item" is of type SPItem
item["Created By"] = web.EnsureUser("AD account name").ID;
item.UpdateOverwriteVersion();

Thursday, January 26, 2012

Toggle Debugging on/off for a Custom Code Web Part in SharePoint

C#
When I render my custom coded SharePoint Web Part, it helps to display extra information to assist me in troubleshooting. I can do this by constructing my web part like this...

...
using System.Web.UI.WebControls.WebParts;
...
public class MyCustomWebPart : WebPart
{
  protected override void CreateChildControls()
  {
    string paramOne = "One";
    this.Controls.Add(new LiteralControl("paramOne=" + paramOne + <br/>));
  }
}

So that my custom Web Part displays "paramOne=One"  Useful for debugging when I want know the value of internal parameters in code.

However, I don't want my user's to see my debugging information. I only want to turn it on in my local browser instance. I do this by adding to the Query String "?debug=true"  So on the end of my URL I append the Query String and update my Controls.Add statement with the following code.

bool.TryParse(Page.Request.QueryString["debug"], out debugOn);
if (debugOn) this.Controls.Add(new LiteralControl("paramOne=" + paramOne));

Wednesday, January 25, 2012

SharePoint Set the Value of a Yes/No Field in Code

C#


// Where "item" is of type SPItem
// how to read
bool result = Convert.ToBoolean(item["YesNoField"]);

// how to write
item["YesNoField"] = true;
item.Update();

Thursday, January 12, 2012

Available Headers in the SPEmailMessage Object

It couldn't find a complete list of email headers for Microsoft.SharePoint.Utilities.SPEmailHeader, so I've compiled one here;

Here's a sample usage that will return the raw email address of the sender...
// emailMessage is of the type SPEmailMessage
string EmailAddress = emailMessage.Headers["Return-Path"].ToString();
// will return "sender@domain.com"

string EmailAddress = emailMessage.Headers["From"].ToString();
// will return "Sender Contact Name <sender@domain.com>"


Ordinal Name Example
1 x-reciever "recipient@domain.com"
2 Received "from IncomingMailServer([IP])..."
3 Received "from IncomingMailServer([IP])..."
4 From "Sender Contact Name <sender@domain.com>"
5 To "Recipient Contact Name <recipient@domain.com>"
6 Subject "Subject Text"
7 Thread-Topic "Topic Text"
8 Thread-Index guid
9 Date ddd, dd mmm yyyyy hh:mm:ss +0000
10 Message-ID "UniqueId@IncomingMailServer"
11 Accept-Language "en-US"
12 Content-Language "en-US"
13 X-MS-Has-Attach "yes" or ""
14 X-MS-TNEF-Correlator ""
15 x-originating-ip "[IP]"
16 Content-Type ??
17 MIME-Version "1.0"
18 Return-Path "sender@domain.com

Here's a handy way to parse out the date...
DateTime sent = DateTime.Parse(emailMessage.Headers["Date"]);