There are following steps in the code:
1. Retrieve default view columns name for a document library and add columns in Datagrid.
2. Get listitems as search result (For this, use GetListItemsFromFTSQuery method from here)
3. Bind listitems to datagrid
DataTable returnResults; protected void Page_Load(object sender, EventArgs e) {if (Page.IsPostBack) { AddDefaultColumnsInGrid(); } } void AddDefaultColumnsInGrid() { using (SPSite siteCollection = new SPSite(txtDocLib.Text)) { SPWeb CRsite = siteCollection.OpenWeb(); SPList ContRep = CRsite.GetListFromUrl(txtDocLib.Text); //get field objects from Content Repository - needed to obtain display name of fields SPFieldCollection ListFields = ContRep.Fields; //get field names used in search results view (these are "internal" names, not display names) SPView SRView = ContRep.Views["All Documents"]; SPViewFieldCollection SRViewFields = SRView.ViewFields; System.Collections.Specialized.StringCollection InternalViewFldNames = SRViewFields.ToStringCollection(); //Add Columns to datagrid ************************************************ Start BoundColumn C = null; string str = ""; for (int i = 0; i < InternalViewFldNames.Count; i++) { C = new BoundColumn(); if (i > 0) //no header for doc icon { C.HeaderText = ListFields.GetFieldByInternalName(InternalViewFldNames[i]).Title; //this is the DISPLAY name str += "Column: " + C.HeaderText + "|"; C.SortExpression = InternalViewFldNames[i]; str += "Sort by: " + InternalViewFldNames[i] + "<br>"; //change "name" column to be "file name" if (C.HeaderText == "Name") C.HeaderText = "File Name"; if (C.HeaderText == "Title") C.SortExpression = "SortByTitle"; } C.DataField = InternalViewFldNames[i]; C.ItemStyle.VerticalAlign = VerticalAlign.Top; DataGrid1.Columns.Add(C); } //add hidden column for sorting by title (NOT URL of title!) C = new BoundColumn(); C.HeaderText = "SortByTitle"; C.SortExpression = "SortByTitle"; C.DataField = "SortByTitle"; C.Visible = false; DataGrid1.Columns.Add(C); } } protected void btnSubmit_Click(object sender, EventArgs e) { BindData(GetListItemsFromFTSQuery(txtDocLib.Text, txtSearch.Text),""); } void BindData(List<SPListItem> items, string sortOrder) { DataTable ResultsTable = new DataTable(); DataRow ResultsRow; string strField; using (SPSite siteCollection = new SPSite(txtDocLib.Text)) { SPWeb CRsite = siteCollection.OpenWeb(); SPList ContRep = CRsite.GetListFromUrl(txtDocLib.Text); //get field objects from Content Repository - needed to obtain display name of fields SPFieldCollection ListFields = ContRep.Fields; //get field names used in search results view (these are "internal" names, not display names) SPView SRView = ContRep.Views["All Documents"]; SPViewFieldCollection SRViewFields = SRView.ViewFields; System.Collections.Specialized.StringCollection InternalViewFldNames = SRViewFields.ToStringCollection(); //process each view field, building results table columns for (int j = 0; j < InternalViewFldNames.Count; j++) { ResultsTable.Columns.Add(new DataColumn(InternalViewFldNames[j], typeof(string))); } //add the hidden column ResultsTable.Columns.Add(new DataColumn("SortByTitle", typeof(string))); foreach (SPListItem lstItem in items) { ResultsRow = ResultsTable.NewRow(); for (int j = 0; j < InternalViewFldNames.Count; j++) { try { ResultsRow[InternalViewFldNames[j]] = lstItem[ListFields.GetFieldByInternalName(InternalViewFldNames[j]).Title].ToString(); } catch { } strField = ResultsRow[InternalViewFldNames[j]].ToString(); if (ListFields.GetFieldByInternalName(InternalViewFldNames[j]).TypeAsString == "WMTags") { SPFieldMultiColumnValue mulVal = new SPFieldMultiColumnValue(strField); ResultsRow[InternalViewFldNames[j]] = mulVal[0].ToString(); } //some fields may have "x;#" at the beginning - strip it off as well as any others else if (strField.IndexOf("#") >= 0) { strField = strField.Substring(strField.IndexOf("#") + 1); //get's the first occurrence strField = strField.Replace(";#", ";"); //get rid of any other #'s, leaving the ";" ResultsRow[InternalViewFldNames[j]] = strField; } } //customize "special rows": try { //make icon row display an image ResultsRow["DocIcon"] = "<a href='" + lstItem.Url + "'><img src='/_layouts/images/" + lstItem.File.IconUrl + "' border=0></a>"; //make doc name link to doc property page ResultsRow["Title"] = "<a href='" + lstItem.Url + "'>" + lstItem["Title"] + "</a>"; ResultsRow["SortByTitle"] = lstItem["Title"].ToString(); } catch { } ResultsTable.Rows.Add(ResultsRow); } } //put results into a dataview DataView ResultsView = new DataView(ResultsTable); //sort, if needed if (sortOrder != "") { ResultsView.Sort = sortOrder; } //bind to grid DataGrid1.DataSource = ResultsView; DataGrid1.DataBind(); } protected void DataGrid1_SortCommand(object source, DataGridSortCommandEventArgs e) { BindData(GetListItemsFromFTSQuery(txtDocLib.Text, txtSearch.Text), e.SortExpression); }
Hope, It helps.
Hi,
ReplyDeleteThanks to update this code for moss 2007.
I get always an 'unknown error' when loading the searchresultscr page with your code. Can you give me more info howto implement this code?
Thanks in advance