<br />
<b>Deprecated</b>:  YoastSEO_Vendor\Symfony\Component\DependencyInjection\Container::__construct(): Implicitly marking parameter $parameterBag as nullable is deprecated, the explicit nullable type must be used instead in <b>/home/nubelus/sharedove/adisjugo/wp-content/plugins/wordpress-seo/vendor_prefixed/symfony/dependency-injection/Container.php</b> on line <b>60</b><br />
<br />
<b>Deprecated</b>:  YoastSEO_Vendor\League\OAuth2\Client\Provider\AbstractProvider::authorize(): Implicitly marking parameter $redirectHandler as nullable is deprecated, the explicit nullable type must be used instead in <b>/home/nubelus/sharedove/adisjugo/wp-content/plugins/wordpress-seo/vendor_prefixed/league/oauth2-client/src/Provider/AbstractProvider.php</b> on line <b>416</b><br />
<br />
<b>Deprecated</b>:  YoastSEO_Vendor\GuzzleHttp\Client::getConfig(): Implicitly marking parameter $option as nullable is deprecated, the explicit nullable type must be used instead in <b>/home/nubelus/sharedove/adisjugo/wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/Client.php</b> on line <b>181</b><br />
<br />
<b>Deprecated</b>:  YoastSEO_Vendor\GuzzleHttp\ClientInterface::getConfig(): Implicitly marking parameter $option as nullable is deprecated, the explicit nullable type must be used instead in <b>/home/nubelus/sharedove/adisjugo/wp-content/plugins/wordpress-seo/vendor_prefixed/guzzlehttp/guzzle/src/ClientInterface.php</b> on line <b>77</b><br />
{"id":792,"date":"2008-02-27T11:27:00","date_gmt":"2008-02-27T10:27:00","guid":{"rendered":"https:\/\/blog.sharedove.com\/adisjugo\/?p=792"},"modified":"2008-02-27T11:27:00","modified_gmt":"2008-02-27T10:27:00","slug":"fighting-the-spgridview-contol","status":"publish","type":"post","link":"https:\/\/blog.sharedove.com\/adisjugo\/index.php\/2008\/02\/27\/fighting-the-spgridview-contol\/","title":{"rendered":"Fighting the SPGridView contol"},"content":{"rendered":"<p>hOne piece of SharePoint toolbox, rarely used, and not well known, is a SPGridView control, a SharePoint wrapper over a standard .NET GridView control. <\/p>\n<p>Since the SPGridView is not well documented, and implementing standard functionality with it is somewhat painful, I have developed a wrapper around it, which can be used to bind the control at runtime by using bindable data sources.<\/p>\n<p><!--more--><\/p>\n<p>This piece od code is from my upcoming session on <a href=\"http:\/\/www.mswindays.com\/\">Microsoft WinDays 2008<\/a>.<\/p>\n<p>Hope it helps.<\/p>\n<p>using System;<br \/>\nusing System.Collections.Generic;<br \/>\nusing System.Linq;<br \/>\nusing System.Text;<br \/>\nusing Microsoft.SharePoint;<br \/>\nusing Microsoft.SharePoint.WebControls;<br \/>\nusing System.Diagnostics;<br \/>\nusing System.Web.UI.WebControls;<br \/>\nusing System.Drawing;<br \/>\nusing System.Data;<br \/>\nusing System.Web.UI;<br \/>\nusing System.Collections;<\/p>\n<p>namespace Daenet.SharePointApi<br \/>\n{<\/p>\n<p>    #region DaenetSPGridView<br \/>\n    \/\/\/ <\/p>\n<summary>\n    \/\/\/ Daenet&#8217;s override of the SPGridView control, which handles some default SPGridView&#8217;s bugs, and adds some standard behaviours<br \/>\n    \/\/\/ <\/summary>\n<p>    public class DaenetSPGridView : SPGridView<br \/>\n    {<br \/>\n        #region public properties<\/p>\n<p>        \/\/\/ <\/p>\n<summary>\n        \/\/\/ Fields which are displayed in grid, comma separated<br \/>\n        \/\/\/ <\/summary>\n<p>        public string FieldsToDisplay { get; set; }<\/p>\n<p>        \/\/\/ <\/p>\n<summary>\n        \/\/\/ field headers<br \/>\n        \/\/\/ <\/summary>\n<p>        public string FieldsHeaders { get; set; }<\/p>\n<p>        \/\/\/ <\/p>\n<summary>\n        \/\/\/ fields on which sorting is enabled<br \/>\n        \/\/\/ <\/summary>\n<p>        public string SortFields { get; set; }<\/p>\n<p>        \/\/\/ <\/p>\n<summary>\n        \/\/\/ Field which will display the menu<br \/>\n        \/\/\/ <\/summary>\n<p>        public string MenuField { get; set; }<\/p>\n<p>        \/\/\/ <\/p>\n<summary>\n        \/\/\/ Grid data source<br \/>\n        \/\/\/ <\/summary>\n<p>        public object GridDataSource { get; set; }<\/p>\n<p>        #endregion<\/p>\n<p>        #region private fields<br \/>\n        \/\/\/ <\/p>\n<summary>\n        \/\/\/ Array of column names<br \/>\n        \/\/\/ <\/summary>\n<p>        string[] m_ColumnNames;<\/p>\n<p>        \/\/\/ <\/p>\n<summary>\n        \/\/\/ Array of Column headers<br \/>\n        \/\/\/ <\/summary>\n<p>        string[] m_HeaderNames;<\/p>\n<p>        #endregion<\/p>\n<p>        #region constructor<br \/>\n        \/\/\/ <\/p>\n<summary>\n        \/\/\/ Initialize new DaenetSPGrid<br \/>\n        \/\/\/ <\/summary>\n<p>        \/\/\/ <param name=\"gridName\">ID of the newly created grid<\/param>\n        \/\/\/ <param name=\"alternateColor\">Row alternate color &#8211; leave empty if no alternate color<\/param>\n        \/\/\/ <param name=\"gridDataSource\">DataSource object we want to use as the grid source<\/param>\n        \/\/\/ <param name=\"displayFields\">Fields we want to display in grid, comma separated<\/param>\n        \/\/\/ <param name=\"fieldHeaders\">Headers of the fields we want to display<\/param>\n        \/\/\/ <param name=\"sortFields\">Fields we want to enable sorting onto, comma separated<\/param>\n        \/\/\/ <param name=\"filteredFields\">Fields we want to enable filtering onto, comma separated, in the &#8220;FilterDataFields&#8221; mode<\/param>\n        \/\/\/ <param name=\"pageSize\">Do we want to enable paging? 0 &#8211; no, n-number of the rows per page<\/param>\n        \/\/\/ <param name=\"groupingField\">Set the grouping field if we want to enable grouping<\/param>\n        public DaenetSPGridView(string gridName, Color alternateColor, object gridDataSource, string displayFields, string fieldHeaders, string sortFields, string filteredFields, int pageSize, string groupingField, string menuField)<br \/>\n        {<br \/>\n            \/\/ Set basic gridview properties<br \/>\n            this.ID = gridName;<br \/>\n            this.AutoGenerateColumns = false;<br \/>\n            if (alternateColor != null) this.AlternatingRowStyle.BackColor = alternateColor;<\/p>\n<p>            \/\/set properties<br \/>\n            GridDataSource = gridDataSource;<br \/>\n            FieldsToDisplay = displayFields;<br \/>\n            FieldsHeaders = fieldHeaders;<br \/>\n            SortFields = sortFields;<br \/>\n            MenuField = menuField;<\/p>\n<p>            \/\/generate grid coumns<br \/>\n            generateColumns();<\/p>\n<p>            \/\/<br \/>\n            \/\/set filtering<br \/>\n            if (!string.IsNullOrEmpty(filteredFields))<br \/>\n            {<br \/>\n                \/\/ Set properties for filtering<br \/>\n                this.AllowFiltering = true;<br \/>\n                this.FilterDataFields = filteredFields;<br \/>\n                this.FilteredDataSourcePropertyName = &#8220;FilterExpression&#8221;;<br \/>\n                this.FilteredDataSourcePropertyFormat = &#8220;{1} LIKE &#8216;{0}'&#8221;;<\/p>\n<p>                this.RowDataBound += new GridViewRowEventHandler(gridView_RowDataBound);<br \/>\n            }<\/p>\n<p>            if (!string.IsNullOrEmpty(sortFields))<br \/>\n            {<br \/>\n                this.AllowSorting = true;<br \/>\n            }<\/p>\n<p>            if (pageSize != 0)<br \/>\n            {<br \/>\n                \/\/ Set properties for paging<br \/>\n                this.PageSize = pageSize;<br \/>\n                this.AllowPaging = true;<br \/>\n                this.PagerStyle.HorizontalAlign = HorizontalAlign.Right;<br \/>\n            }<\/p>\n<p>            if (!string.IsNullOrEmpty(groupingField))<br \/>\n            {<br \/>\n                \/\/AllowGrouping=&#8221;true&#8221; AutoGenerateColumns=&#8221;false&#8221; GroupField=&#8221;StateName&#8221;<br \/>\n                \/\/AllowGroupCollapse=&#8221;true&#8221; DisplayGroupFieldName=&#8221;false&#8221;><br \/>\n                this.AllowGrouping = true;<br \/>\n                this.GroupField = groupingField;<br \/>\n                this.AllowGroupCollapse = true;<br \/>\n                this.DisplayGroupFieldName = true;<\/p>\n<p>            }<br \/>\n        }<br \/>\n        #endregion<\/p>\n<p>        #region public methods<\/p>\n<p>        public void SetColumnMenu(string columnName)<br \/>\n        {<br \/>\n            try<br \/>\n            {<br \/>\n                \/\/<br \/>\n                \/\/TODO:<br \/>\n                \/\/1 &#8211; item Click &#8211; UrlFields<br \/>\n                \/\/2 &#8211; item Click &#8211; UrlFormat<\/p>\n<p>                \/\/<br \/>\n                \/\/first hide the original column<br \/>\n                DataControlField originalColumn = findColumnFromHeaderText(getHeaderTextFromColumnId(columnName));<br \/>\n                string originalHeaderText = originalColumn.HeaderText;<br \/>\n                originalColumn.HeaderText += &#8220;-OLD&#8221;;<br \/>\n                originalColumn.Visible = false;<\/p>\n<p>                \/\/<br \/>\n                \/\/ Replace the Original coloumn with a shiny menu<br \/>\n                SPMenuField colMenu = new SPMenuField();<br \/>\n                colMenu.HeaderText = originalHeaderText;<br \/>\n                colMenu.TextFields = columnName;<br \/>\n                colMenu.MenuTemplateId = columnName + &#8220;Menu&#8221;;<br \/>\n                colMenu.NavigateUrlFields = &#8220;ID,Title&#8221;;<br \/>\n                colMenu.NavigateUrlFormat = &#8220;do.aspx?p={0}&#038;q={1}&#8221;;<br \/>\n                colMenu.TokenNameAndValueFields = &#8220;EDIT=ID,NAME=Title&#8221;;<br \/>\n                colMenu.SortExpression = columnName;<\/p>\n<p>                \/\/<br \/>\n                \/\/generate dropdown<br \/>\n                MenuTemplate presenterListMenu = new MenuTemplate();<br \/>\n                presenterListMenu.ID = columnName + &#8220;PresenterListMenu&#8221;;<\/p>\n<p>                \/\/<br \/>\n                \/\/generate dropdownitems<br \/>\n                MenuItemTemplate biogMenu = new MenuItemTemplate(<br \/>\n                    &#8220;Read Biography&#8221;, &#8220;\/_layouts\/images\/EawfNewUser.gif&#8221;);<br \/>\n                biogMenu.ClientOnClickNavigateUrl = &#8220;do.aspx?this=%EDIT%&#038;that=%NAME%&#8221;;<br \/>\n                presenterListMenu.Controls.Add(biogMenu);<\/p>\n<p>                MenuItemTemplate broadcastMenu = new MenuItemTemplate(<br \/>\n                        &#8220;Recent Broadcasts&#8221;, &#8220;\/_layouts\/images\/ICWM.gif&#8221;);<br \/>\n                broadcastMenu.ClientOnClickNavigateUrl = &#8220;do.aspx?this=%EDIT%&#038;that=%NAME%&#8221;;<br \/>\n                presenterListMenu.Controls.Add(broadcastMenu);<\/p>\n<p>                \/\/separator<br \/>\n                MenuSeparatorTemplate sepMenu = new MenuSeparatorTemplate();<br \/>\n                presenterListMenu.Controls.Add(sepMenu);<\/p>\n<p>                MenuItemTemplate favMenu = new MenuItemTemplate(<br \/>\n                       &#8220;Add to Favorites&#8221;, &#8220;\/_layouts\/images\/addtofavorites.gif&#8221;);<br \/>\n                favMenu.ClientOnClickNavigateUrl = &#8220;do.aspx?this=%EDIT%&#038;that=%NAME%&#8221;;<br \/>\n                presenterListMenu.Controls.Add(favMenu);<\/p>\n<p>                \/\/add presenter menu to the controls collection<br \/>\n                this.Controls.Add(presenterListMenu);<\/p>\n<p>                \/\/add column with menu temlae<br \/>\n                this.Columns.Add(colMenu);<\/p>\n<p>            }<br \/>\n            catch (Exception ex)<br \/>\n            {<br \/>\n                Trace.WriteLine(ex.Message);<br \/>\n                throw;<br \/>\n            }<br \/>\n        }<\/p>\n<p>        \/\/\/ <\/p>\n<summary>\n        \/\/\/ Sets the column width &#8211; doesn&#8217;t work<br \/>\n        \/\/\/ <\/summary>\n<p>        \/\/\/ <param name=\"columnName\"><\/param>\n        \/\/\/ <param name=\"widthUnit\"><\/param>\n        public void SetColumnWidth(string columnName, Unit widthUnit)<br \/>\n        {<br \/>\n            try<br \/>\n            {<\/p>\n<p>                DataControlField column = findColumnFromHeaderText(getHeaderTextFromColumnId(columnName));<br \/>\n                column.ControlStyle.Width = widthUnit;<\/p>\n<p>            }<br \/>\n            catch (Exception ex)<br \/>\n            {<br \/>\n                Trace.WriteLine(ex.Message);<br \/>\n                throw;<br \/>\n            }<br \/>\n        }<br \/>\n        #endregion<\/p>\n<p>        #region private methods<br \/>\n        \/\/\/ <\/p>\n<summary>\n        \/\/\/ Generate column names<br \/>\n        \/\/\/ <\/summary>\n<p>        private void generateColumns()<br \/>\n        {<br \/>\n            try<br \/>\n            {<br \/>\n                m_ColumnNames = FieldsToDisplay.Split(&#8220;,&#8221;.ToCharArray());<br \/>\n                m_HeaderNames = FieldsHeaders.Split(&#8220;,&#8221;.ToCharArray());<\/p>\n<p>                List<string> sortFieldsList = SortFields.Split(&#8220;,&#8221;.ToCharArray()).ToList<string>();<\/p>\n<p>                string menuFieldName = &#8220;&#8221;;<br \/>\n                string[] menuFieldInfo = new string[]{};<br \/>\n                if (!string.IsNullOrEmpty(MenuField))<br \/>\n                {<br \/>\n                    menuFieldInfo = MenuField.Split(&#8220;,&#8221;.ToCharArray());<br \/>\n                    menuFieldName = menuFieldInfo[0];<br \/>\n                }<\/p>\n<p>                \/\/retrieve underlaying data from the DataSource<br \/>\n                \/\/IEnumerable underlayingDataTable = ((IEnumerable)(((ObjectDataSource)(GridDataSource)).Select()));<br \/>\n                IEnumerable enumerableData = ((IEnumerable)(((ObjectDataSource)(GridDataSource)).Select()));<\/p>\n<p>                \/\/<br \/>\n                \/\/iterate through the columns we want to display<br \/>\n                for (int i = 0; i < m_ColumnNames.Length; i++)\n                {\n                    if (m_ColumnNames[i] != menuFieldName)\n                    {\n                        BoundField colName = new BoundField();\n                        colName.DataField = m_ColumnNames[i];\n                        colName.HeaderText = m_HeaderNames[i];\n                        if (sortFieldsList.Contains(m_ColumnNames[i])) colName.SortExpression = m_ColumnNames[i];\n                        this.Columns.Add(colName);\n                    }\n                    else\n                    {\n                        \/*\n                         * <SharePointWebControls:SPMenuField NavigateUrlFields=\"ID\" NavigateUrlFormat=\"StoreManager.aspx?ID={0}\"\n                            TextFields=\"StoreName\" MenuTemplateId=\"spmStoreMenu\" HeaderText=\"Store\" TokenNameAndValueFields=\"ID=ID\" \/><br \/>\n                        <SharePointWebControls:SPBoundField DataField=\"IsArchived\" HeaderText=\"Status\" \/><br \/>\n                         * *\/<br \/>\n                        SPMenuField colName = new SPMenuField();<br \/>\n                        colName.NavigateUrlFields = &#8220;ID&#8221;;<br \/>\n                        colName.NavigateUrlFormat = menuFieldInfo[1];\/\/&#8221;StoreManager.aspx?ID={0}<br \/>\n                        colName.TextFields = m_ColumnNames[i];<br \/>\n                        colName.HeaderText = m_HeaderNames[i];<br \/>\n                        colName.TokenNameAndValueFields = &#8220;ID=ID&#8221;;<br \/>\n                        colName.MenuTemplateId = menuFieldInfo[2];<br \/>\n                        this.Columns.Add(colName);<br \/>\n                    }<br \/>\n                }<br \/>\n            }<br \/>\n            catch (Exception ex)<br \/>\n            {<br \/>\n                throw new ApplicationException(&#8220;Formatted SharePoint Grid Exception&#8221;, ex);<br \/>\n            }<br \/>\n        }<\/p>\n<p>        \/*<br \/>\n         \/\/\/ <\/p>\n<summary>\n        \/\/\/ Generate column names<br \/>\n        \/\/\/ <\/summary>\n<p>        private void generateColumns()<br \/>\n        {<br \/>\n            try<br \/>\n            {<br \/>\n                m_ColumnNames = FieldsToDisplay.Split(&#8220;,&#8221;.ToCharArray());<br \/>\n                m_HeaderNames = FieldsHeaders.Split(&#8220;,&#8221;.ToCharArray());<\/p>\n<p>                List<string> sortFieldsList = SortFields.Split(&#8220;,&#8221;.ToCharArray()).ToList<string>();<\/p>\n<p>                \/\/retrieve underlaying data from the DataSource<br \/>\n                DataTable underlayingDataTable = ((DataView)(((ObjectDataSource)(GridDataSource)).Select())).Table;<\/p>\n<p>                \/\/<br \/>\n                \/\/iterate through the columns we want to display<br \/>\n                for (int i = 0; i < m_ColumnNames.Length; i++)\n                {\n\n                    DataColumn col = underlayingDataTable.Columns[m_ColumnNames[i]];\n                    Type colType = col.DataType;\n\n                    \/\/\n                    \/\/string and numeric fields\n                    if (colType == typeof(string) || colType == typeof(int) || colType == typeof(double))\n                    {\n                        BoundField colName = new BoundField();\n                        colName.DataField = m_ColumnNames[i];\n                        colName.HeaderText = m_HeaderNames[i];\n                        if (sortFieldsList.Contains(m_ColumnNames[i])) colName.SortExpression = m_ColumnNames[i];\n                        this.Columns.Add(colName);\n                    }\n\n                    \/\/\n                    \/\/checkbox fields\n                    if (colType == typeof(bool))\n                    {\n                        TemplateField colName = new TemplateField();\n                        colName.HeaderText = m_HeaderNames[i];\n                        colName.ItemTemplate = new CheckBoxItemTemplate(ListItemType.Item, m_ColumnNames[i]);\n                        if (sortFieldsList.Contains(m_ColumnNames[i])) colName.SortExpression = m_ColumnNames[i];\n                        this.Columns.Add(colName);\n                    }\n                }\n            }\n            catch (Exception ex)\n            {\n                throw new ApplicationException(\"Formatted SharePoint Grid Exception\", ex);\n            }\n        }\n        *\/\n\n        \/\/\/ \n\n<summary>\n        \/\/\/ Sets the filter icon on the filtered field<br \/>\n        \/\/\/ We catch the gridView_RowDataBound event, check if it is a header row<br \/>\n        \/\/\/ and if it is header row, set the icon on the cell of the corresponding column<br \/>\n        \/\/\/ <\/summary>\n<p>        \/\/\/ <param name=\"sender\"><\/param>\n        \/\/\/ <param name=\"e\"><\/param>\n        private void gridView_RowDataBound(object sender, GridViewRowEventArgs e)<br \/>\n        {<br \/>\n            try<br \/>\n            {<br \/>\n                \/\/first check if it is a header row<br \/>\n                if ((sender != null) &#038;&#038; (e.Row.RowType == DataControlRowType.Header))<br \/>\n                {<br \/>\n                    \/\/get the filter field name (ID of the field)<br \/>\n                    string strFilteredColumn = ((DaenetSPGridView)sender).FilterFieldName;<\/p>\n<p>                    \/\/get the header name from the field name<br \/>\n                    string headerText = getHeaderTextFromColumnId(strFilteredColumn);<\/p>\n<p>                    \/\/set the icon<br \/>\n                    if (!string.IsNullOrEmpty(headerText))<br \/>\n                        SetGridViewFilterIcon(headerText, e.Row);<br \/>\n                }<br \/>\n            }<br \/>\n            catch (Exception ex)<br \/>\n            {<br \/>\n                Debug.WriteLine(ex.Message);<br \/>\n            }<br \/>\n        }<\/p>\n<p>        \/\/\/ <\/p>\n<summary>\n        \/\/\/ Sets the Filter icon on the filtered column<br \/>\n        \/\/\/ <\/summary>\n<p>        \/\/\/ <param name=\"columnHeaderText\">Header text of the column we are setting the icon to<\/param>\n        \/\/\/ <param name=\"row\">Grid row of the cell we want to set the icon to &#8211; has to be the header row<\/param>\n        public void SetGridViewFilterIcon(string columnHeaderText, GridViewRow row)<br \/>\n        {<br \/>\n            try<br \/>\n            {<\/p>\n<p>                if ((!string.IsNullOrEmpty(columnHeaderText)) &#038;&#038; (row != null))<br \/>\n                {<br \/>\n                    \/\/<br \/>\n                    \/\/find an index of the column we are searching for<br \/>\n                    int column = findColumnIndexFromHeaderText(columnHeaderText);<\/p>\n<p>                    \/\/<br \/>\n                    \/\/if column index found, set the icon<br \/>\n                    if (column != -1)<br \/>\n                    {<br \/>\n                        addIconToCell(row.Cells[column], &#8220;filterIcon&#8221;, &#8220;\/_layouts\/images\/ewr093.gif&#8221;, ImageAlign.Left, &#8220;2px&#8221;, &#8220;&#8221;, &#8220;&#8221;, &#8220;&#8221;);<br \/>\n                    }<br \/>\n                }<br \/>\n            }<br \/>\n            catch (Exception ex)<br \/>\n            {<br \/>\n                Debug.WriteLine(ex.Message);<br \/>\n                throw;<br \/>\n            }<br \/>\n        }<\/p>\n<p>        \/\/\/ <\/p>\n<summary>\n        \/\/\/ Finds a DataControlField (column) in the SPGridView columns based on column&#8217;s header text &#8211;<br \/>\n        \/\/\/ since we do not have IDs there.<br \/>\n        \/\/\/ <\/summary>\n<p>        \/\/\/ <param name=\"headerText\">Header text of the column we are searching for<\/param>\n        \/\/\/ <returns>DataControlField of the column or null if not found<\/returns><br \/>\n        private DataControlField findColumnFromHeaderText(string headerText)<br \/>\n        {<br \/>\n            for (int iIndex = 0; iIndex < this.Columns.Count; iIndex++)\n            {\n                DataControlField oField = this.Columns[iIndex];\n                if (oField.HeaderText == headerText) return oField;\n            }\n\n            return null;\n        }\n\n        \/\/\/ \n\n<summary>\n        \/\/\/ Finds a DataControlField (column) index (integer) in the SPGridView columns based on column&#8217;s header text &#8211;<br \/>\n        \/\/\/ since we do not have IDs there.<br \/>\n        \/\/\/ <\/summary>\n<p>        \/\/\/ <param name=\"headerText\">Header text of the column we are searching for<\/param>\n        \/\/\/ <returns>Integer index of the column or -1 if not found<\/returns><br \/>\n        private int findColumnIndexFromHeaderText(string headerText)<br \/>\n        {<br \/>\n            for (int iIndex = 0; iIndex < this.Columns.Count; iIndex++)\n            {\n                DataControlField oField = this.Columns[iIndex];\n                if (oField.HeaderText == headerText) return iIndex;\n            }\n\n            return -1;\n        }\n\n\n        \/\/\/ \n\n<summary>\n        \/\/\/ Gets the header text from the coulumn id &#8211; used for finding columns&#8230;<br \/>\n        \/\/\/ <\/summary>\n<p>        \/\/\/ <param name=\"columnId\">column Id we are lookinf for<\/param>\n        \/\/\/ <returns>Header text of the column<\/returns><br \/>\n        private string getHeaderTextFromColumnId(string columnId)<br \/>\n        {<br \/>\n            try<br \/>\n            {<br \/>\n                int columnPosition = m_ColumnNames.ToList<string>().IndexOf(columnId);<br \/>\n                if (columnPosition >= 0)<br \/>\n                {<br \/>\n                    return m_HeaderNames[columnPosition];<br \/>\n                }<br \/>\n                else<br \/>\n                {<br \/>\n                    return null;<br \/>\n                }<br \/>\n            }<br \/>\n            catch (Exception ex)<br \/>\n            {<br \/>\n                Debug.WriteLine(ex.Message);<br \/>\n                throw;<br \/>\n            }<br \/>\n        }<\/p>\n<p>        \/\/\/ <\/p>\n<summary>\n        \/\/\/ Adds an icon to the cell<br \/>\n        \/\/\/ <\/summary>\n<p>        \/\/\/ <param name=\"oRow\"><\/param>\n        \/\/\/ <param name=\"iIndex\"><\/param>\n        private static void addIconToCell(TableCell cellToAddIcon, string iconId, string imageUrl, ImageAlign align, string marginTop, string marginLeft, string marginRight, string marginBottom)<br \/>\n        {<br \/>\n            System.Web.UI.WebControls.Image oFilterIcon = new System.Web.UI.WebControls.Image();<br \/>\n            oFilterIcon.ImageUrl = imageUrl;<br \/>\n            oFilterIcon.ImageAlign = align;<\/p>\n<p>            if (!string.IsNullOrEmpty(marginTop)) oFilterIcon.Style[System.Web.UI.HtmlTextWriterStyle.MarginTop] = marginTop;<br \/>\n            if (!string.IsNullOrEmpty(marginLeft)) oFilterIcon.Style[System.Web.UI.HtmlTextWriterStyle.MarginLeft] = marginLeft;<br \/>\n            if (!string.IsNullOrEmpty(marginRight)) oFilterIcon.Style[System.Web.UI.HtmlTextWriterStyle.MarginRight] = marginRight;<br \/>\n            if (!string.IsNullOrEmpty(marginBottom)) oFilterIcon.Style[System.Web.UI.HtmlTextWriterStyle.MarginBottom] = marginBottom;<\/p>\n<p>            oFilterIcon.ID = iconId;<\/p>\n<p>            Panel oPanel = new Panel();<br \/>\n            oPanel.Controls.Add(oFilterIcon);<\/p>\n<p>            \/\/&#8221;2px&#8221;<br \/>\n            \/\/ImageAlign.Left<br \/>\n            \/\/&#8221;\/_layouts\/images\/ewr093.gif&#8221;<br \/>\n            \/\/GridViewRow oRow, int iIndex<br \/>\n            \/\/oRow.Cells[iIndex]<br \/>\n            cellToAddIcon.Controls.Add(oPanel);<br \/>\n        }<\/p>\n<p>        #endregion<\/p>\n<p>        #region overrides<br \/>\n        \/\/\/ <\/p>\n<summary>\n        \/\/\/ Override LoadControlState to Rebind if datasource not there<br \/>\n        \/\/\/ <\/summary>\n<p>        \/\/\/ <param name=\"savedState\"><\/param>\n        protected override void LoadControlState(object savedState)<br \/>\n        {<br \/>\n            base.LoadControlState(savedState);<br \/>\n            if (this.DataSource == null)<br \/>\n            {<br \/>\n                this.DataBind();<br \/>\n            }<\/p>\n<p>        }<br \/>\n        #endregion<\/p>\n<p>    }<br \/>\n    #endregion<\/p>\n<p>    \/\/<br \/>\n    \/\/Item Template classes<br \/>\n    #region Item template classes<\/p>\n<p>    \/\/\/ <\/p>\n<summary>\n    \/\/\/ Check Box Item Template Class<br \/>\n    \/\/\/ <\/summary>\n<p>    public class CheckBoxItemTemplate : ITemplate<br \/>\n    {<\/p>\n<p>        \/\/\/ <\/p>\n<summary>\n        \/\/\/ Item Type &#8211; determines if we are dealing with the header or list item<br \/>\n        \/\/\/ <\/summary>\n<p>        private ListItemType m_ItemType;<\/p>\n<p>        \/\/\/ <\/p>\n<summary>\n        \/\/\/ Name of the column &#8211; field we are setting the template for<br \/>\n        \/\/\/ <\/summary>\n<p>        private string m_FieldName;<\/p>\n<p>        \/\/\/ <\/p>\n<summary>\n        \/\/\/ Constructor<br \/>\n        \/\/\/ <\/summary>\n<p>        \/\/\/ <param name=\"itemType\">Item Type &#8211; to determine if the item is header or list item<\/param>\n        \/\/\/ <param name=\"fieldName\">Field name we are setting<\/param>\n        public CheckBoxItemTemplate(ListItemType itemType, string fieldName)<br \/>\n        {<br \/>\n            m_ItemType = itemType;<br \/>\n            m_FieldName = fieldName;<br \/>\n        }<\/p>\n<p>        public void InstantiateIn(System.Web.UI.Control controlContainer)<br \/>\n        {<br \/>\n            if (m_ItemType == ListItemType.Item || m_ItemType == ListItemType.SelectedItem || m_ItemType == ListItemType.AlternatingItem)<br \/>\n            {<br \/>\n                System.Web.UI.WebControls.Image checkIcon = new System.Web.UI.WebControls.Image();<br \/>\n                checkIcon.ImageAlign = ImageAlign.Middle;<\/p>\n<p>                checkIcon.Style[System.Web.UI.HtmlTextWriterStyle.MarginTop] = &#8220;2px&#8221;;<\/p>\n<p>                checkIcon.ID = &#8220;CheckIcon_&#8221; + m_FieldName;<br \/>\n                checkIcon.Visible = true;<br \/>\n                checkIcon.DataBinding += new EventHandler(cb_DataBinding);<br \/>\n                controlContainer.Controls.Add(checkIcon);<br \/>\n            }<br \/>\n        }<\/p>\n<p>        \/\/\/ <\/p>\n<summary>\n        \/\/\/ Catch the databinding event of the checkbox, to set the value<br \/>\n        \/\/\/ <\/summary>\n<p>        \/\/\/ <param name=\"sender\"><\/param>\n        \/\/\/ <param name=\"e\"><\/param>\n        private void cb_DataBinding(object sender, EventArgs e)<br \/>\n        {<\/p>\n<p>            System.Web.UI.WebControls.Image imageSender = (System.Web.UI.WebControls.Image)(sender);<br \/>\n            SPGridViewRow parentRow = (SPGridViewRow)(imageSender.NamingContainer);<br \/>\n            try<br \/>\n            {<br \/>\n                bool cbChecked = (bool)(DataBinder.Eval(parentRow.DataItem, m_FieldName));<\/p>\n<p>                if (cbChecked)<br \/>\n                {<br \/>\n                    imageSender.ImageUrl = &#8220;\/_layouts\/images\/CHECK.GIF&#8221;;<br \/>\n                }<br \/>\n                else<br \/>\n                {<br \/>\n                    imageSender.ImageUrl = &#8220;\/_layouts\/images\/UNCHECK.GIF&#8221;;<br \/>\n                }<\/p>\n<p>            }<br \/>\n            catch (Exception ex)<br \/>\n            {<br \/>\n                Debug.WriteLine(ex.Message);<br \/>\n                imageSender.ImageUrl = &#8220;\/_layouts\/images\/UNCHECK.GIF&#8221;;<br \/>\n            }<br \/>\n        }<br \/>\n    }<br \/>\n    #endregion<\/p>\n<p>}<\/p>\n<p>    public class OdsDataViewWrapper<br \/>\n    {<\/p>\n<p>        \/\/\/ <\/p>\n<summary>\n        \/\/\/ DataView from which we want to display data<br \/>\n        \/\/\/ <\/summary>\n<p>        public static DataTable DataToDisplay { get; set; }<\/p>\n<p>        \/\/\/ <\/p>\n<summary>\n        \/\/\/ Object to display<br \/>\n        \/\/\/ <\/summary>\n<p>        public static IEnumerable ObjectToDisplay { get; set; }<\/p>\n<p>        \/\/\/ <\/p>\n<summary>\n        \/\/\/ Constructor<br \/>\n        \/\/\/ <\/summary>\n<p>        public OdsDataViewWrapper() { }<\/p>\n<p>        \/\/\/ <\/p>\n<summary>\n        \/\/\/ Return data from the view<br \/>\n        \/\/\/ <\/summary>\n<p>        \/\/\/ <returns><\/returns><br \/>\n        public static System.Data.DataTable GetData()<br \/>\n        {<\/p>\n<p>            if (DataToDisplay == null)<br \/>\n            {<br \/>\n                return new DataTable();<br \/>\n            }<br \/>\n            else<br \/>\n            {<br \/>\n                return DataToDisplay;<br \/>\n            }<br \/>\n        }<\/p>\n<p>        \/\/\/ <\/p>\n<summary>\n        \/\/\/ Return object data from the view<br \/>\n        \/\/\/ <\/summary>\n<p>        \/\/\/ <returns>IEnumerable object<\/returns><br \/>\n        public static IEnumerable GetObjectData()<br \/>\n        {<br \/>\n            if (ObjectToDisplay == null)<br \/>\n            {<br \/>\n                List<string> dummyStringList = new List<string>();<br \/>\n                dummyStringList.Add(&#8220;No&#8221;);<br \/>\n                dummyStringList.Add(&#8220;Data&#8221;);<br \/>\n                return dummyStringList;<br \/>\n            }<br \/>\n            else<br \/>\n            {<br \/>\n                return ObjectToDisplay;<br \/>\n            }<br \/>\n        }<\/p>\n<p>        public static int UpdateAuthor(string au_id, string au_lname, string au_fname, string state)<br \/>\n        {<br \/>\n            return 1;<br \/>\n        }<\/p>\n<p>        \/\/\/ <\/p>\n<summary>\n        \/\/\/ Creates an ObjectDataSource object which wrapps the DataTable data<br \/>\n        \/\/\/ <\/summary>\n<p>        \/\/\/ <param name=\"odsID\">ID of the ObjectDataSource<\/param>\n        \/\/\/ <param name=\"dataTable\">DataTable from which we want to display data<\/param>\n        \/\/\/ <returns>ObjectDataSource with wrapped data<\/returns><br \/>\n        public static ObjectDataSource GetObjectDataSource(string odsID, DataTable dataTable)<br \/>\n        {<br \/>\n            DataToDisplay = dataTable;<\/p>\n<p>            ObjectDataSource ods = new ObjectDataSource();<br \/>\n            ods.ID = odsID;<br \/>\n            ods.TypeName = &#8220;Daenet.SharePointApi.OdsDataViewWrapper&#8221;;<br \/>\n            ods.SelectMethod = &#8220;GetData&#8221;;<br \/>\n            OdsDataViewWrapper.DataToDisplay = dataTable;<\/p>\n<p>            return ods;<br \/>\n        }<\/p>\n<p>        \/\/\/ <\/p>\n<summary>\n        \/\/\/ Creates an ObjectDataSource object which wrapps the IEnumerable data<br \/>\n        \/\/\/ <\/summary>\n<p>        \/\/\/ <param name=\"odsID\">ID of the ObjectDataSource<\/param>\n        \/\/\/ <param name=\"dataTable\">DataTable from which we want to display data<\/param>\n        \/\/\/ <returns>ObjectDataSource with wrapped data<\/returns><br \/>\n        public static ObjectDataSource GetObjectDataSource(string odsID, IEnumerable objectSource)<br \/>\n        {<br \/>\n            ObjectToDisplay = objectSource;<\/p>\n<p>            ObjectDataSource ods = new ObjectDataSource();<br \/>\n            ods.ID = odsID;<br \/>\n            ods.TypeName = &#8220;Daenet.SharePointApi.OdsDataViewWrapper&#8221;;<br \/>\n            ods.SelectMethod = &#8220;GetObjectData&#8221;;<br \/>\n            OdsDataViewWrapper.ObjectToDisplay = objectSource;<\/p>\n<p>            return ods;<br \/>\n        }<\/p>\n<p>        \/\/\/ <\/p>\n<summary>\n        \/\/\/ Checks hrom the HttpRequest if the gridview sorting has been set<br \/>\n        \/\/\/ <\/summary>\n<p>        \/\/\/ <param name=\"httpRequest\">HttpRequest object where we are checking if the Filter was earlier set<\/param>\n        \/\/\/ <param name=\"gridView\">SPGridView for which we are setting the Filter<\/param>\n        \/\/\/ <param name=\"expressionKeyName\">Key in the viewstate where we are storing current filter expression<\/param>\n        \/\/\/ <param name=\"viewState\">ViewState collection where we are storing the current filter expression <\/param>\n        public static bool CheckRequestForFilterExpression(HttpRequest httpRequest, DaenetSPGridView gridView, string expressionKeyName, StateBag viewState)<br \/>\n        {<br \/>\n            if ((httpRequest.Form[&#8220;__CALLBACKID&#8221;] == null) ||<br \/>\n                (httpRequest.Form[&#8220;__CALLBACKPARAM&#8221;] == null) ||<br \/>\n                (!httpRequest.Form[&#8220;__CALLBACKID&#8221;].EndsWith(gridView.ID)))<br \/>\n            {<br \/>\n                if (viewState[expressionKeyName] != null)<br \/>\n                {<br \/>\n                    return true;<br \/>\n                }<br \/>\n            }<\/p>\n<p>            return false;<br \/>\n        }<\/p>\n<p>        \/\/\/ <\/p>\n<summary>\n        \/\/\/ Creates a menu template field<br \/>\n        \/\/\/ <\/summary>\n<p>        \/\/\/ <param name=\"templateID\">ID of the menu template field<\/param>\n        \/\/\/ <returns>MEnu template field<\/returns><br \/>\n        public static MenuTemplate GetMenuTemplateField(string templateID, string[] menuItemTexts,<br \/>\n            string[] menuItemDescriptions, string[] menuItemImageUrls, string[] menuItemNavigateUrls )<br \/>\n        {<br \/>\n            \/*<br \/>\n             * <SharePointWebControls:MenuTemplate ID=\"spmStoreMenu\" runat=\"server\"><br \/>\n                    <SharePointWebControls:MenuItemTemplate Text=\"Edit Store\" ID=\"miEditStore\" runat=\"server\"\n                        Description=\"Manage this store\" ImageUrl=\"\/_layouts\/images\/actionseditpage.gif\"\n                        Sequence=\"1\" ClientOnClickNavigateUrl=\"StoreManager.aspx?ID=%ID%\" \/><br \/>\n                <\/SharePointWebControls:MenuTemplate><br \/>\n             * *\/<\/p>\n<p>            MenuTemplate menuField = new MenuTemplate();<br \/>\n            menuField.ID = templateID;<\/p>\n<p>            \/\/<br \/>\n            \/\/add items<br \/>\n            for (int i = 0; i < menuItemTexts.Length; i++)\n            {\n                MenuItemTemplate itemTemplate = new MenuItemTemplate();\n                itemTemplate.Text = menuItemTexts[i];\n                itemTemplate.ID = templateID + \"_item_\" + i.ToString();\n                itemTemplate.Description = menuItemDescriptions[i];\n                itemTemplate.ImageUrl = menuItemImageUrls[i];\n                itemTemplate.Sequence = i;\n                itemTemplate.ClientOnClickNavigateUrl = menuItemNavigateUrls[i];\n\n                menuField.Controls.Add(itemTemplate);\n\n            }\n\n            return menuField;\n        }\n    }\n\n[\/csharp]\n\n<\/p>\n<div class=\"fb-background-color\">\n\t\t\t  <div \n\t\t\t  \tclass = \"fb-comments\" \n\t\t\t  \tdata-href = \"https:\/\/blog.sharedove.com\/adisjugo\/index.php\/2008\/02\/27\/fighting-the-spgridview-contol\/\"\n\t\t\t  \tdata-numposts = \"59\"\n\t\t\t  \tdata-lazy = \"true\"\n\t\t\t\tdata-colorscheme = \"light\"\n\t\t\t\tdata-order-by = \"time\"\n\t\t\t\tdata-mobile=true>\n\t\t\t  <\/div><\/div>\n\t\t  <style>\n\t\t    .fb-background-color {\n\t\t\t\tbackground:  !important;\n\t\t\t}\n\t\t\t.fb_iframe_widget_fluid_desktop iframe {\n\t\t\t    width: 100% !important;\n\t\t\t}\n\t\t  <\/style>\n\t\t  ","protected":false},"excerpt":{"rendered":"<p>hOne piece of SharePoint toolbox, rarely used, and not well known, is a SPGridView control, a SharePoint wrapper over a standard .NET GridView control. Since the SPGridView is not well documented, and implementing standard functionality with it is somewhat painful, I have developed a wrapper around it, which can be used to bind the control [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"","_et_pb_old_content":"","_et_gb_content_width":"","footnotes":""},"categories":[11],"tags":[54,55],"class_list":["post-792","post","type-post","status-publish","format-standard","hentry","category-development","tag-server-object-model","tag-sharepoint"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v25.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Fighting the SPGridView contol - Adis Jugo blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blog.sharedove.com\/adisjugo\/index.php\/2008\/02\/27\/fighting-the-spgridview-contol\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Fighting the SPGridView contol - Adis Jugo blog\" \/>\n<meta property=\"og:description\" content=\"hOne piece of SharePoint toolbox, rarely used, and not well known, is a SPGridView control, a SharePoint wrapper over a standard .NET GridView control. Since the SPGridView is not well documented, and implementing standard functionality with it is somewhat painful, I have developed a wrapper around it, which can be used to bind the control [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blog.sharedove.com\/adisjugo\/index.php\/2008\/02\/27\/fighting-the-spgridview-contol\/\" \/>\n<meta property=\"og:site_name\" content=\"Adis Jugo blog\" \/>\n<meta property=\"article:published_time\" content=\"2008-02-27T10:27:00+00:00\" \/>\n<meta name=\"author\" content=\"adis.jugo\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"adis.jugo\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/blog.sharedove.com\/adisjugo\/index.php\/2008\/02\/27\/fighting-the-spgridview-contol\/\",\"url\":\"https:\/\/blog.sharedove.com\/adisjugo\/index.php\/2008\/02\/27\/fighting-the-spgridview-contol\/\",\"name\":\"Fighting the SPGridView contol - Adis Jugo blog\",\"isPartOf\":{\"@id\":\"https:\/\/blog.sharedove.com\/adisjugo\/#website\"},\"datePublished\":\"2008-02-27T10:27:00+00:00\",\"author\":{\"@id\":\"https:\/\/blog.sharedove.com\/adisjugo\/#\/schema\/person\/a5ca63552094ce9d5a0440f3a1ac9a4c\"},\"breadcrumb\":{\"@id\":\"https:\/\/blog.sharedove.com\/adisjugo\/index.php\/2008\/02\/27\/fighting-the-spgridview-contol\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/blog.sharedove.com\/adisjugo\/index.php\/2008\/02\/27\/fighting-the-spgridview-contol\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/blog.sharedove.com\/adisjugo\/index.php\/2008\/02\/27\/fighting-the-spgridview-contol\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/blog.sharedove.com\/adisjugo\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Fighting the SPGridView contol\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/blog.sharedove.com\/adisjugo\/#website\",\"url\":\"https:\/\/blog.sharedove.com\/adisjugo\/\",\"name\":\"Adis Jugo blog\",\"description\":\"The Southern Side\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/blog.sharedove.com\/adisjugo\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/blog.sharedove.com\/adisjugo\/#\/schema\/person\/a5ca63552094ce9d5a0440f3a1ac9a4c\",\"name\":\"adis.jugo\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/blog.sharedove.com\/adisjugo\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/cc5a23cf1bd0b9d8401c9dd65c6c141041ec0c6e37eedbb511779e4a40a198fd?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/cc5a23cf1bd0b9d8401c9dd65c6c141041ec0c6e37eedbb511779e4a40a198fd?s=96&d=mm&r=g\",\"caption\":\"adis.jugo\"},\"url\":\"https:\/\/blog.sharedove.com\/adisjugo\/index.php\/author\/adisjugo\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Fighting the SPGridView contol - Adis Jugo blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blog.sharedove.com\/adisjugo\/index.php\/2008\/02\/27\/fighting-the-spgridview-contol\/","og_locale":"en_US","og_type":"article","og_title":"Fighting the SPGridView contol - Adis Jugo blog","og_description":"hOne piece of SharePoint toolbox, rarely used, and not well known, is a SPGridView control, a SharePoint wrapper over a standard .NET GridView control. Since the SPGridView is not well documented, and implementing standard functionality with it is somewhat painful, I have developed a wrapper around it, which can be used to bind the control [&hellip;]","og_url":"https:\/\/blog.sharedove.com\/adisjugo\/index.php\/2008\/02\/27\/fighting-the-spgridview-contol\/","og_site_name":"Adis Jugo blog","article_published_time":"2008-02-27T10:27:00+00:00","author":"adis.jugo","twitter_card":"summary_large_image","twitter_misc":{"Written by":"adis.jugo","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/blog.sharedove.com\/adisjugo\/index.php\/2008\/02\/27\/fighting-the-spgridview-contol\/","url":"https:\/\/blog.sharedove.com\/adisjugo\/index.php\/2008\/02\/27\/fighting-the-spgridview-contol\/","name":"Fighting the SPGridView contol - Adis Jugo blog","isPartOf":{"@id":"https:\/\/blog.sharedove.com\/adisjugo\/#website"},"datePublished":"2008-02-27T10:27:00+00:00","author":{"@id":"https:\/\/blog.sharedove.com\/adisjugo\/#\/schema\/person\/a5ca63552094ce9d5a0440f3a1ac9a4c"},"breadcrumb":{"@id":"https:\/\/blog.sharedove.com\/adisjugo\/index.php\/2008\/02\/27\/fighting-the-spgridview-contol\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blog.sharedove.com\/adisjugo\/index.php\/2008\/02\/27\/fighting-the-spgridview-contol\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/blog.sharedove.com\/adisjugo\/index.php\/2008\/02\/27\/fighting-the-spgridview-contol\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blog.sharedove.com\/adisjugo\/"},{"@type":"ListItem","position":2,"name":"Fighting the SPGridView contol"}]},{"@type":"WebSite","@id":"https:\/\/blog.sharedove.com\/adisjugo\/#website","url":"https:\/\/blog.sharedove.com\/adisjugo\/","name":"Adis Jugo blog","description":"The Southern Side","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blog.sharedove.com\/adisjugo\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/blog.sharedove.com\/adisjugo\/#\/schema\/person\/a5ca63552094ce9d5a0440f3a1ac9a4c","name":"adis.jugo","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blog.sharedove.com\/adisjugo\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/cc5a23cf1bd0b9d8401c9dd65c6c141041ec0c6e37eedbb511779e4a40a198fd?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/cc5a23cf1bd0b9d8401c9dd65c6c141041ec0c6e37eedbb511779e4a40a198fd?s=96&d=mm&r=g","caption":"adis.jugo"},"url":"https:\/\/blog.sharedove.com\/adisjugo\/index.php\/author\/adisjugo\/"}]}},"_links":{"self":[{"href":"https:\/\/blog.sharedove.com\/adisjugo\/index.php\/wp-json\/wp\/v2\/posts\/792","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.sharedove.com\/adisjugo\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.sharedove.com\/adisjugo\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.sharedove.com\/adisjugo\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.sharedove.com\/adisjugo\/index.php\/wp-json\/wp\/v2\/comments?post=792"}],"version-history":[{"count":0,"href":"https:\/\/blog.sharedove.com\/adisjugo\/index.php\/wp-json\/wp\/v2\/posts\/792\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.sharedove.com\/adisjugo\/index.php\/wp-json\/wp\/v2\/media?parent=792"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.sharedove.com\/adisjugo\/index.php\/wp-json\/wp\/v2\/categories?post=792"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.sharedove.com\/adisjugo\/index.php\/wp-json\/wp\/v2\/tags?post=792"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}