Showing posts with label CQWP. Show all posts
Showing posts with label CQWP. Show all posts

Tuesday, 26 June 2012

User vs UserMulti

I spent almost a whole day trying to figure out why ViewFieldsOverride only imports the UserName of AssignedTo field in Content Query Web Part.

After trying various ways and banging my head against the table, it turns out that by changing Type="UserMulti" from Type="User", AssignedTo field will have the format 'ID;#UserName'.

Wednesday, 6 June 2012

Extending the Content Query Web Part (ContentByQueryWebPart)

I was assigned a task to allow filtering of CQWP results without requiring the user to edit the webpart.
I figured out the following simple way to extend the CQWP by having the filtering done with a drop down list on the webpart itself.
At first I wanted to use the consumer/provider method but decided this was easier...
Here's the code:
namespace ExtendCQWP.FilterWP
{
    [ToolboxItemAttribute(false)]
    public class FilterWP: Microsoft.SharePoint.Publishing.WebControls.ContentByQueryWebPart
    {
        protected override void OnLoad(EventArgs e)
        { 
            if (this.Page.Request.QueryString["FilterField1"]!=null && this.Page.Request.QueryString["FilterValue1"]!=null)
            {
                this.FilterField1 = this.Page.Request.QueryString["FilterField1"].ToString(); 
                this.FilterValue1 = this.Page.Request.QueryString["FilterValue1"].ToString();
            }
        }
        protected override void CreateChildControls()
        {             
            DropDownList ddl = new DropDownList();
            ddl.Items.Add(new ListItem("All", "All"));            
            ddl.Items.Add(new ListItem("HR", "HR"));
            ddl.Items.Add(new ListItem("Finance", "Finance"));
            ddl.Items.Add(new ListItem("IT", "IT"));

            ddl.SelectedIndexChanged += new EventHandler(ddl_SelectedIndexChanged);
            ddl.AutoPostBack = true;
            ddl.EnableViewState = true;

            if (this.Page.Request.QueryString["FilterValue1"] != null)
            { 
                foreach(ListItem item in ddl.Items)
                    if(item.Text.Equals(this.Page.Request.QueryString["FilterValue1"].ToString()))
                    {
                        item.Selected = true;
                        break;
                    }
            }

            this.Controls.Add(ddl);            
            base.CreateChildControls();
        }

        void ddl_SelectedIndexChanged(object sender, EventArgs e)
        {
            DropDownList tmpddl = (DropDownList)sender;
            if(tmpddl.SelectedValue.Equals("All"))
                SPUtility.Redirect("http://mysite/SitePages/cq.aspx", SPRedirectFlags.Trusted, HttpContext.Current);
            else
                SPUtility.Redirect("http://mysite/SitePages/cq.aspx?FilterField1=Division&FilterValue1=" + tmpddl.SelectedValue, SPRedirectFlags.Trusted, HttpContext.Current);
        }
    }
}

Here's how the list and web part looks like.