Sunday, June 14, 2015

Converting image byte array to image control directly


**********************************************************
private void GetUserPhoto(int id)
        {
            try
            {
                LookUps obj = new LookUps();
                List<UserPhotoEntity> newObj = obj.GetPhotoById(id);
                Byte[] photoByte = newObj[0].Photo;
                ImageConverter ic = new ImageConverter();
                System.Drawing.Image img = (System.Drawing.Image)ic.ConvertFrom(photoByte);
               // Image1.ImageUrl = "data:image/jpg;base64," + Convert.ToBase64String((byte[])photoByte);
                Image1.ImageUrl ="data:image/jpg;base64," + Convert.ToBase64String((byte[])photoByte);


                //Response.ClearHeaders();
                //Response.ContentType = "image/JPEG";
                //Response.AddHeader("content-disposition", "inline;filename=Photo.jpeg");
                //Response.BinaryWrite(photoByte);
            }
            catch (Exception ex)
            {
                ex.ToString();
            }
**************************************************************

Checklist for coding in c# for SharePoint Development

Checklist for SharePoint Development


·         Does my code properly dispose of SharePoint objects?
·         Does my code cache objects properly?
·         Does my code cache the correct types of objects?
·         Does my code use thread synchronization when necessary?
·         Does my code work as efficiently for 1,000 users as it does for 10 users?
·         Code should not include hardcoding of any type

Naming Conventions

·         Coding should follow a proper naming conventions, either Camel or Pascal casing, use PascalCasing for class names and method names. use camelCasing for method arguments and local variables
·         Make sure to not to use underscores in identifiers. Exception: you can prefix private static variables with an underscore.
·         Make sure to use noun or noun phrases to name a class
·         Prefix interfaces with the letter I.  Interface names are noun (phrases) or adjectives.
·         organize namespaces with a clearly defined structure
o   // Examples
o   namespace Company.Product.Module.SubModule
o   namespace Product.Module.Component
o   namespace Product.Layer.Module.Group
·         do not use Hungarian notation or any other type identification in identifiers
·         // Correct
·         int counter;
·         string name;
·          
·         // Avoid
·         int iCounter;
·         string strName;

·         Controls Naming Convention:-
o   Textbox: txtName
o   Button: btnName
o   Label: lblName
o   Panel: pnlViewer
o   Image: imgName
Properties:s
o   Use noun or noun phrase with Pascal case like UserID, Password etc.
Methods:
o   Use verb or verb phrase with Pascal case like InsertQuery(), GetUserInfo() etc.

Coding Flow and Comment

·         Write only one statement per line.
·         Write only one declaration per line.
·         Add at least one blank line between method definitions and property definitions.
·         Place the comment on a separate line, not at the end of a line of code.
·         Begin comment text with an uppercase letter.
·         End comment text with a period.
·         Insert one space between the comment delimiter (//) and the comment text
·         Do not create formatted blocks of asterisks around comments.
·         Either use Camel case like userID or Pascal case like UserID

Object Model

·         Make sure SharePoint objects like SPSite and SPWeb are being disposed properly. Do not.Site or dispose of any item returned directly from the Microsoft.SharePoint.SPContext Microsoft.SharePoint.SPContext.Web property except when you obtain reference to these using a constructor or when you use AllWebs.
  • The SPSiteCollection.Add method creates and returns a new SPSite object. You should dispose of any SPSite object returned from the SPSiteCollection.Add method.
  • The SPSiteCollection [] index operator returns a new SPSite object for each access. An SPSiteinstance is created even if that object was already accessed. The following code samples demonstrate improper disposal of the SPSite object.
  • The SPSite.AllWebs.Add method creates and returns an SPWeb object. You should dispose of anySPWeb object returned from SPSite.AllWebs.Add.
  • The SPWebCollection.Add method creates and returns an SPWeb object that needs to be disposed.
  • The SPSite.AllWebs [] index operator returns a new SPWeb instance each time it is accessed.
  • The OpenWeb method and SelfServiceCreateSite method (all signatures) create an SPWeb object and return it to the caller.
·         The Microsoft.Office.Server.UserProfiles.PersonalSite returns an SPSite object that must be disposed

  • The SPWeb.Webs property returns an SPWebCollection object. The SPWeb objects in this collection must be disposed.
  • The SPWeb.Webs.Add method (or Add) creates and returns a new SPWeb object. You should dispose of any SPWeb object returned from this method call.
  • The SPWeb.Webs[] index operator returns a new SPWeb object for each access

Using Objects in Event Receivers

Do not instantiate SPWeb, SPSite, SPList, or SPListItem objects within an event receiver. Event receivers that instantiate SPSite, SPWeb, SPList, or SPListItem objects instead of using the instances passed via the event properties can cause the following problems:
  • They incur significant additional roundtrips to the database. (One write operation can result in up to five additional roundtrips in each event receiver.)
Calling the Update method on these instances can cause subsequent Update calls in other registered event receivers to fail.


  • Do not use an unbounded SPQuery object.
  • An SPQuery object without a value for RowLimit will perform poorly and fail on large lists. Specify aRowLimit between 1 and 2000 and, if necessary, page through the list.
  • Use indexed fields.
  • If you query on a field that is not indexed, the query will be blocked whenever it would result in a scan of more items than the query threshold (as soon as there are more items in the list than are specified in the query threshold). Set SPQuery.RowLimit to a value that is less than the query threshold.
  • If you know the URL of your list item and want to query by FileRef, use SPWeb.GetListItem(stringstrUrl, string field1, params string[] fields) instead.

Exception Handling

·         Make sure to use Try-catch and using statements in exception-handling
·         Don't catch (Exception) more than once per thread
·         Cleanup code should be put in finally blocks
·         Don't use exception handling as means of returning information from a method
·         Errors/Exceptions must be logged



·         Switching ON and OFF the AllowUnsafeUpdates option, as and when appropriately.
·         Disposing the SPSite objects after usage.
·         Disposing the SPWeb objects after usage.
·         Avoid disposing objects derived from SPContext.
·         Try the "Using" clause - to avoid the overhead of disposing objects explicitly.

Customization

·         Don't change any default SharePoint installation files
·         Custom master pages will be based on a copy of the default master page
·         Avoid customising content pages with SharePoint Designer
·         Avoid inline server side script in pages
·         All applications should be globalised and then localised to English
·         Package all web parts and templates as features




Deploy code 
Deploy code using wsp solutions. Ensure code is not in debug mode when compiled, it runs slower and potentially can crash/holdup your production environment. Implement CAS, deploy to bins if possible and apply CAS security policies to custom coding.

Configuration

·         In a shared environment no AppSetting entries are generally allowed in the web.config configuration file of WSS. Instead consider using your own application specific configuration file and store along within your application or feature folder. The feature.xml file should be used for storing Feature properties. A SharePoint list can be considered for storing common configuration data

Features:-

·         All Feature scope should be Site collection scope or lower instead of at the Web-application level. If features can be re-used then they could be deployed at the web-application level.
·         Feature Title should be appropriately named.
·         Provide full description which should include information on the usage, any restrictions, and dependencies on other features, assembly, ownership and contact information. This description should be included in the Feature.xml in addition to any documentation


Attach multiple file through the File upload control and attach to SharePoint list item on save



Uploading multiple files on save button to SharePoint  List Item 

Attachment Related tasks

File Upload Event
**************************************************************************
public void UploadButton_onClick(object sender, EventArgs e))
{
                     DataTable fileDt =new DataTable ();
                     DataRow row=null;
                     fileDt = GetFileTable();  
                     row = fileDt.NewRow();
                     row["Id"] = attachmentId;
                     row["FileName"] = fileAttachmentUpload.FileName;
                     row["FilePath"] = "";
                     row["FileContent"] = GetFileStream();  // This is File Byte stream
                     fileDt.Rows.Add(row);
                     ViewState["FilesList"] = fileDt;
}

Breaking the file in File Stream. and return the Byte array
************************ **************************************************
        /// <summary>
        /// Returning Files in byte [] array after reading by stream
        /// </summary>
        /// <returns></returns>
        public byte[] GetFileStream()
        {
            byte[] contents = null;
            try
            {
                Stream fStream = fileAttachmentUpload.PostedFile.InputStream;
                contents = new byte[fStream.Length];
                fStream.Read(contents, 0, (int)fStream.Length);
                fStream.Close();
            }
            catch (Exception ex)
            {
                errorLog.LogEntery(ex);
            }
            return contents;
        }

Attaching the files to SharePoint ListItem *************************************************************************
/// <summary>
        /// Adding Attachment Files To SharePoint ListItem
        /// </summary>
        /// <param name="Item"></param>
        public void AddAttachmentToList(SPListItem Item)
        {
            DataTable dt = null;
            try
            {
                SPSecurity.RunWithElevatedPrivileges(delegate()
                {
                    SPWeb web = SPContext.Current.Web;
                    if (ViewState["FilesList"] != null)
                    {
                        dt = (DataTable)ViewState["FilesList"];
                        foreach (DataRow row in dt.Rows)
                        {
                            byte[] fs = (byte[])row["FileContent"];
                            string fileName = (string)row["FileName"];
                             SPAttachmentCollection attachments = Item.Attachments;
                            attachments.Add(fileName, fs);
                           }
                    }
                    web.AllowUnsafeUpdates = true;
                    taskItem.Update();
                    web.AllowUnsafeUpdates = false;
                });
            }
            catch (Exception ex)
            {
                errorLog.LogEntery(ex);
            }

        }

Getting All Attachment from ListItem
************************************************************************

/// Getting all attachment from a listitem with fileName and its file url and return in Hashtable

public Hashtable GetListAttachemnts(SPListItem taskItem)
        {
            Hashtable _listItems = new Hashtable();
            try
            {

                SPAttachmentCollection attachments = taskItem.Attachments;

                foreach (var attachment in attachments)
                {
                    string attachmentAbsoluteURL = taskItem.Attachments.UrlPrefix + attachment;
                    _listItems.Add(attachment, attachmentAbsoluteURL);

                }
            }
            catch (Exception ex)
            {
                errorLog.LogEntery(ex);
            }
            return _listItems;
        }


Wednesday, June 10, 2015

Recover Lost Lookup Content after restoring the site backup or export/import of list from List Template operation in SharePoint



-------------------------------------------------------------------------------------------------
Try these steps:

Step1:  Download the STP of List template e.g.: test.stp

Step2:  Rename the STP as test.cab

Step3:  Extract the cab file.

Step4:  Change the values in manifest file after extracting the Cab

Find the Lookup values in manifest

<Field Type="Lookup" List="{Guid Value} "/>

Replace Guid value with Lists/ListName

<Field Type="Lookup"  List="Lists/ListName"/>

Step5: After saving the manifest.xml file, change it into cab file with the following command

C:\> makecab "C:\Temp\manifest.xml"  "temp.cab" /L   "C:\Temp"

Step6: After changing into Cab, rename it to STP again.

Step7: Upload the STP and create the list.

You will get your lost content.

Happy Coding




PowerShell command to configure state service in SharePoint 2010


$ErrorActionPreference = "Stop"

Add-PSSnapin Microsoft.SharePoint.PowerShell -EA 0

# The State Service is required in order to use the out-of-the-box workflows in
# SharePoint Server 2010 (e.g. Approval - SharePoint 2010) or any other features
# that leverage InfoPath Forms Services.
#
# When using the Farm Configuration Wizard to configure the State Service, the
# resulting database is named StateService_{GUID}. In order to avoid lengthy
# database names containing GUIDs, the State Service is configured using PowerShell.

function ConfigureStateService(
    [string] $stateServiceName = $(Throw "Value cannot be null: stateServiceName"),
    [string] $stateServiceDatabaseName =
        $(Throw "Value cannot be null: stateServiceDatabaseName"))
{
   Write-Host "Configuring the State Service..."

    Write-Debug "stateServiceName: $stateServiceName"
    Write-Debug "stateServiceDatabaseName: $stateServiceDatabaseName"

    $serviceApp = Get-SPStateServiceApplication -Identity "$stateServiceName" `
       -Debug:$false -EA 0

    If ($serviceApp -ne $null)
    {       
        Write-Host "The State Service has already been configured."
        return
    }
   
    $database = New-SPStateServiceDatabase -Name $stateServiceDatabaseName `
        -Debug:$false
               
    $serviceApp = New-SPStateServiceApplication -Name $stateServiceName `
        -Database $database -Debug:$false
               
    New-SPStateServiceApplicationProxy -ServiceApplication $serviceApp `
        -Name $stateServiceName -DefaultProxyGroup -Debug:$false > $null

                Write-Host -Fore Green "Successfully configured the State Service."
}

function Main()
{
    $stateServiceName = "State Service"
    $stateServiceDatabaseName = "StateService"

    ConfigureStateService $stateServiceName $stateServiceDatabaseName
}

Main


Thursday, June 4, 2015

Error occurred in deployment step ‘Add Solution': A feature with ID has already been installed in this farm.

Error occurred in deployment step ‘Add Solution': A feature with ID has already been installed in this farm



Error : 
Error occurred in deployment step ‘Add Solution': A feature with ID 0f92d042-22b6-4518-8c9f-3eb2ab720eed has already been installed in this farm.  Use the force attribute to explicitly re-install the feature
Reason :
The same solution/feature has been already Installed in the Farm or the site collection.
Resolution :
Find the Feature with the given Id (Here 0f92d042-22b6-4518-8c9f-3eb2ab720eed) in the solution. Open the feature in Visual Studio.
From the Property tab, Change the property “Always force Install” to “True”. Deploy the solution again…

Source: https://msbuzzz.wordpress.com/2011/09/07/error-occurred-in-deployment-step-add-solution-a-feature-with-id-has-already-been-installed-in-this-farm/

Disable Right Click on Page

<script type ="text/javascript" >


    var message = "Sorry, right-click has been disabled";

    function clickIE() { if (document.all) { (message); return false; } }
    function clickNS(e) {
        if
(document.layers || (document.getElementById && !document.all)) {
            if (e.which == 2 || e.which == 3) { (message); return false; }
        }
    }
    if (document.layers)
    { document.captureEvents(Event.MOUSEDOWN); document.onmousedown = clickNS; }
    else { document.onmouseup = clickNS; document.oncontextmenu = clickIE; }
    document.oncontextmenu = new Function("return false")

    document.onkeydown = function (ev) {
        var a;
        ev = window.event;
        if (typeof ev == "undefined") {
            alert("PLEASE DON'T USE KEYBORD");
        }
        a = ev.keyCode;

        alert("PLEASE DON'T USE KEYBORD");
        return false;
    }
    document.onkeyup = function (ev) {
        var charCode;

        if (typeof ev == "undefined") {
            ev = window.event;
            alert("PLEASE DON'T USE KEYBORD");
        } else {
            alert("PLEASE DON'T USE KEYBORD");
        }
        return false;
    }

    document.onLoad = setInterval("window.clipboardData.setData('text','')", 10);
    document.onselectstart = "return false";
    document.oncontextmenu = "return false";
   
    </script>
 <style type="text/css">
        
     @media print {
   BODY { display: none !important;}
   </style>