I need to display the DataList grouped by Category then by Sub-Category and then by Topic as shown below .
My database is Sharepoint List.
Category1
Sub-Category1
Topic1
Topic2
Sub-Category2
Topic1
Category 2
Sub-Category 1
Topic 1
Sub-Category 2
Topic 1
Category 3
Sub-Category1
Topic 1
Sub-Category2
Topic1
Category 4
Sub-Category1
Topic1
I am able to Group items Using Category Columnbut not further with Sub Category and Topic column
Please Suggest me how to group items with multiple columns using DataList Control ?
Below code code works fine for Grouping with One column like Category (Sharepoint Visual WebPart)
My Code :
<div id="col" runat="server" class="column col-1">
<asp:DataList ID="parentData" runat="server" RepeatColumns="2" RepeatDirection="Vertical" OnItemDataBound="parentData_ItemDataBound">
<ItemTemplate>
<div style="width: 150px; height: 150px">
<h4 id="h4Id1" runat="server" class="subtitle"><%#DataBinder.Eval(Container.DataItem, "Category")%></h4>
<asp:DataList ID="childData" runat="server">
<ItemTemplate>
<ul>
<li><a id="aId1" runat="server" href='<%#DataBinder.Eval(Container.DataItem,"Url")%>'><%#DataBinder.Eval(Container.DataItem, "Title")%></a></li>
</ul>
</ItemTemplate>
</asp:DataList>
</div>
</ItemTemplate>
</asp:DataList>
</div>
Code Behind C#
Within Page Load Function {
SPQuery query1 = new SPQuery(); // Caml query to sort by Display Order
query1.Query = "<GroupBy Collapse='TRUE'><FieldRef Name='Category'/></GroupBy><OrderBy><FieldRef Name='Display Order' Ascending='True'/></OrderBy>";
SPListItemCollection items = list.GetItems(query1);
DataTable dataTable = new DataTable();
DataColumn dataColumn;
dataColumn = new DataColumn("Title", Type.GetType("System.String"));
dataTable.Columns.Add(dataColumn);
dataColumn = new DataColumn("Url", Type.GetType("System.String"));
dataTable.Columns.Add(dataColumn);
dataColumn = new DataColumn("Category", Type.GetType("System.String"));
dataTable.Columns.Add(dataColumn);
DataRow dataRow;
foreach (SPListItem item in items)
{
dataRow = dataTable.NewRow();
dataRow["Category"] = item["Category"].ToString();
dataRow["Title"] = item["Name"].ToString();
dataRow["Url"] = url;
dataTable.Rows.Add(dataRow);
}
DataTable dtParent = new DataTable();
DataView view = new DataView(dataTable); //pass DataTable object to a DataView
dtParent = view.ToTable(true, "Category"); //Select Distinct Category
CategoryCount = dtParent.Rows.Count;
DataSet dataSet = new DataSet(); // Initialize a new Data Set
dataSet.Tables.Add(dtParent); // Add parent Table to the DataSet
dataSet.Tables.Add(dataTable); // Add default table to DataSet
dataSet.Relations.Add(new DataRelation("Categories", dataSet.Tables[0].Columns["Category"],dataSet.Tables[1].Columns["Category"], false)); // Pass Parent and Child DataTables in DataRelation
parentData.DataSource = dataSet.Tables[0];
parentData.DataBind(); // Bind Parent DataList
}
// Function on Item Data Boundprotected void parentData_ItemDataBound(object sender, System.Web.UI.WebControls.DataListItemEventArgs e)
{
DataListItem item = e.Item;
NoOfColumns = (int)Math.Ceiling((float)CategoryCount / 2);
parentData.RepeatColumns = NoOfColumns;
if ((item.ItemType == ListItemType.Item) || (item.ItemType == ListItemType.AlternatingItem))
{
DataList innerRep = e.Item.FindControl("childData") as DataList;
DataRowView dataRowView = (DataRowView)item.DataItem;
innerRep.DataSource = dataRowView.CreateChildView("Categories");
innerRep.DataBind();
}
}
Regards, Sud Zohaan Technet Formum