Monday, October 8, 2012

Useful links for Access Services 2013 in SharePoint 2013




Intro to Access 2013


SQL and Access 2013


Access Blog


Three part series. This is part 1.  Gives a good insight to internals of SharePoint.


Improving the Reach and Manageability of Microsoft Access 2010 Database Applications with Microsoft Access Services


Access 2013 desktop database reference





Access 2013 web app demo


Wednesday, August 29, 2012

Lookup field dropdown position issue

I was trying to create a custom webpart that will display a form to submit data in a list. The list had few lookup fields.
Whenever, I click on that image it displays us with a drop-down containing all the values, but the funniest part is you can select a particular item either by double click or by selecting it once and clicking it else where on the page or by tabbing system of the keyboard. But I want it work like a normal drop-down selection in other words just with a single click and also the control should be closer to other controls from usability perspective.


To fix this issue. you need to set InDesign ="true";

 Ex.BaseFieldControl webControl = field.FieldRenderingControl;

webControl.ID =
string.Format("ctrl_{0}_{1}", field.InternalName, pplCount);


webControl.FieldName = field.Title;

webControl.ItemContext =
SPContext.GetContext(HttpContext.Current, lstReqData.DefaultView.ID, lstReqData.ID, lstReqData.ParentWeb);

webControl.RenderContext = SPContext.GetContext(HttpContext.Current, lstReqData.DefaultView.ID, lstReqData.ID, lstReqData.ParentWeb);

webControl.ControlMode = SPControlMode.New;

webControl.ListId = lstReqData.ID;

webControl.InDesign =
true;

 If you are using form field you can set it by following changes in aspx page

<SharePoint:FormField runat="server" InDesign="true" ID="myFieldId" ControlMode="New" FieldName="myFieldName" />

Wednesday, June 6, 2012

Use Metadata Navigation in Wiki Pages (Sharepoint 2010)

If you want to use Metadata navigation tree in Wiki Page, you have to do the following:
  • Activate Metadata Navigation and Filtering feature on site level
image
  • Navigate to Library settings page of your “Pages” library and select Metadata navigation settings
  • From “Configure Navigation Hierarchies” select “Wiki Categories” and click “Add” and “OK”
image
  • Navigate to Pages library again
http://<Your Wiki Site Url>/Pages/Forms/AllItems.aspx

But when you click on any of the pages on the right panel, the navigation tree will disappear.

 

You have to change the master page or better to create and deploy a new one (via Sharepoint Designer or wsp)
You have to include a reference to MetadataNavTree control and put it in some placeholder (QuickLaunchNav) on the master page file.
  • Put this markup in the beginning of the page
<%@ Register TagPrefix="wssuc" TagName="MetadataNavTree" src="~/_controltemplates/MetadataNavTree.ascx" %>
  • Put this code in <asp:ContentPlaceHolder id="QuickLaunchNav" runat="server"> tag
<asp:ContentPlaceHolder id="QuickLaunchNav" runat="server">
<wssuc:MetadataNavTree id="mdnt" runat="server" />

The result is:

Monday, May 21, 2012

Calling Javascript / Jquery / ECMA script from an UpdatePanel in SharePoint

You've probably used ClientScript.RegisterStartupScript in your SharePoint application page and it works just fine.
for example:-
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "Close", "<script type=\"text/javascript\">SP.UI.ModalDialog.commonModalDialogClose(0);</script>");
 However, if you try it within an UpdatePanel control, you would notice that it simply doesn't execute.

The solution to this problem is to use ScriptManager.RegisterStartupScript instead. You can call it like so:
ScriptManager.RegisterClientScriptBlock(UpdatePanelSites, UpdatePanelSites.GetType(), "Close", "SP.UI.ModalDialog.commonModalDialogClose(0);", true);

Thursday, January 12, 2012

Select Distinct or Unique values from SharePoint List



I was looking around for the simple way of getting unique values from SharePoint list without affecting performance. I have seen several ways of doing it. For example, we can get all the items and then check if item exists in the array or some other collection. Another example, you can load your data into DataTable and then select unique values using DataTable method, following is snippet of code below on how to use it

GetUniqueColumnData("List Name", "ColumnName");


private void GetUniqueColumnData(string ListName, string ColumnName)
{
try
{
using (SPSite site = SPContext.Current.Site)
{
using (SPWeb web = site.OpenWeb())
{
DataTable dtList = new DataTable("TableName");
SPList list = web.Lists[ListName];
if (list != null)
{
SPQuery query = new SPQuery();
query.Query = "<OrderBy><FieldRef Name='" + ColumnName + "'/></Order By><FieldRef Name='" + ColumnName + "'/>";
dtList = list.GetItems(query).GetDataTable();
dtList = new DataView(dtList).ToTable(true, new string[] { ColumnName });
}
}
}
}
catch (System.Exception ex)
{
LoggingService.LogErrorInULS(ex.Message + "Stack Trace: "+ ex.StackTrace,TraceSeverity.High);
}
}

but I discovered one very simple method for selecting Distinct Values in SharePoint called GetDistinctFieldValues. Please see snippet of code below on how to use it


using (SPSite site = SPContext.Current.Site)
{
using (SPWeb web = site.OpenWeb())
{
SPList objList = web.Lists["List Name"];
SPField field = objList.Fields.GetField("Field Name");

Object[,] values;
uint numberValues = objList.GetDistinctFieldValues(field, out values);

for (int i = 0; i < numberValues; i++)
comboBox1.Items.Add(values.GetValue(0, i).ToString());

}
}

Tuesday, October 18, 2011

Remove Event Receiver in Sharepoint List

I encountered a strange behavior in SharePoint; this phenomenon happens when I created an event handler and attach it to a list template using a web-site level feature. I saved the list as template, the event handler reference is saved inside the list template (STP file) and when I created an instance using the template it caused the following problems:
1.     The event handler activated automatically on a web site where the feature is not enabled.
2.     If the event feature is enabled in the web site the event will pop twice (In my case it was sending mail twice on Item Added event).
I wrote a small console application to remove attached event handlers.

        static void Main(string[] args)
        {
            try
            {
                string strAppUrl = ConfigurationManager.AppSettings["applicationUrl"].ToString();
                string[] strDelimit = { "/" };
                string[] strSites = strAppUrl.Split(strDelimit, StringSplitOptions.RemoveEmptyEntries);
                string strSiteURL = strSites[0] + "//" + strSites[1];
                string strWebRelUrl = strAppUrl.Substring(strSiteURL.Length);
                using (SPSite site = new SPSite(strSiteURL))
                using (SPWeb web = site.OpenWeb(strWebRelUrl))
                {
                    string listName = ConfigurationManager.AppSettings["ListName"].ToString();
                    SPList list = web.Lists[listName];

                    if (list != null)
                    {
                        int countVal = list.EventReceivers.Count;
                        if (countVal > 0)
                        {
                            for (int i = 0; i < countVal; i++)
                            {
                                Console.WriteLine(list.EventReceivers[0].Name.ToString() + "Deleting");
                                list.EventReceivers[0].Delete();
                            }
                            //Update the list.
                            list.Update();
                            Console.WriteLine("Operation completed succesfully");

                            Console.ReadLine();
                        }
                        else
                        {
                            Console.WriteLine("No event handlers are attached to the list : " + list.Title);
                            Console.ReadLine();
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                Console.Write(ex.Message);
                Console.ReadLine();
            }
        }