public KPGridJsonProperties(bool isSearch, int page, int rows,
                             string propertyOrder, string orderTypeJason,
                             string filterJson,  KPSessionJQGrid sessionJQGrid, string propertyCompany,
                             ICriterion initialFilter, Order initialOrder, object[] colModel)
 {
     IsSearch = isSearch;
     Page = page;
     Rows = rows;
     PropertyOrder = propertyOrder;
     OrderTypeJson = orderTypeJason;
     User = sessionJQGrid.SecuritySession.Login;
     Company = sessionJQGrid.SecuritySession.FrwCompany;
     PropertyCompanyEntity = propertyCompany;
     FilterJson = filterJson;
     ColModel = Array.ConvertAll<object, string>(colModel, Convert.ToString);
     List<JqGridColumnCustom> jqGridColumnCustomList = new List<JqGridColumnCustom>();
     foreach (string item in ColModel)
         jqGridColumnCustomList.Add(KPJsonJqGrid.GetColumnCustom(item));
     ColumnsCustom = jqGridColumnCustomList.ToArray();
     InitialFilter = initialFilter;
     InitialOrder = initialOrder;
 }
        public string Build(string pagerID, string tableID, KPPageBase page)
        {
            StringBuilder sbColNames = new StringBuilder();
            StringBuilder sbColModel = new StringBuilder();
            StringBuilder sbSortName = new StringBuilder();
            sbSortName.Append(this.PrimaryKey);

            string fieldNameTryException = null;
            try
            {
                foreach (KPItemModel item in KPItemsModel)
                {
                    fieldNameTryException = item.FieldName;

                    #region Create Display Name
                    if (sbColNames.Length != 0)
                        sbColNames.Append(", ");

                    if (!String.IsNullOrEmpty(item.HeaderName))
                        sbColNames.AppendFormat("'{0}'", item.HeaderName);
                    else
                    {
                        DisplayNameAttribute[] displayName = TypeEntity.GetProperty(item.FieldName).GetCustomAttributes(typeof(DisplayNameAttribute), false) as DisplayNameAttribute[];
                        if (displayName.Length > 0)
                            sbColNames.AppendFormat("'{0}'", displayName[0].DisplayName);
                        else
                            sbColNames.AppendFormat("'{0}'", item.FieldName);
                    }
                    #endregion

                    #region Create colModels
                    if (sbColModel.Length != 0)
                    {
                        sbColModel.AppendFormat(",{0}", Environment.NewLine);
                    }

                    sbColModel.Append("{");

                    if (item is KPEntityModel)
                    {
                        sbColModel.AppendFormat(" name: '{0}.{1}', index: '{0}', ", item.FieldName, ((KPEntityModel)item).FieldNameDescription);
                    }
                    else if (item is KPEnumModel)
                    {
                        Type typeEnum = KPGenericUtil.GetTypeByNamespace(((KPEnumModel)item).NamespaceEnum);
                        string itemsComboBoxSearch = this.GetEnumeratorsSearchJqGrid(typeEnum);
                        sbColModel.AppendFormat(" name: '{0}_{1}', index: '{0}', formatter:'select', stype: 'select', ", item.FieldName, ((KPEnumModel)item).NamespaceEnum);
                        sbColModel.AppendFormat("edittype:'select', editoptions: {{ value: '{0}' }}, ", itemsComboBoxSearch);
                        sbColModel.AppendFormat("searchoptions:{{ sopt:['eq'], value: '{0}' }}, ", itemsComboBoxSearch);
                    }
                    else if (item is KPBooleanModel)
                    {
                        KPBooleanModel itemBoolean = item as KPBooleanModel;
                        string itemsComboBoxSearch = this.GetBooleanSearchJqGrid(itemBoolean.CustomTrue, itemBoolean.CustomFalse);
                        sbColModel.AppendFormat(" name: '{0}', index: '{0}', formatter:'select', stype: 'select', ", item.FieldName);
                        sbColModel.AppendFormat("edittype:'select', editoptions: {{ value: '{0}' }}, ", itemsComboBoxSearch);
                        sbColModel.AppendFormat("searchoptions:{{ sopt:['eq'], value: '{0}' }}, ", itemsComboBoxSearch);
                    }
                    else
                    {
                        if (!item.FieldName.Equals(PrimaryKey))
                            sbColModel.AppendFormat(" name: '{0}', index: '{0}', ", item.FieldName);
                    }

                    if (item.FieldName.Equals(PrimaryKey))
                        sbColModel.AppendFormat(" name: '{0}', index: '{0}', key: true, ", item.FieldName);

                    sbColModel.AppendFormat("width: '{0}', sortable: '{1}', editable: '{2}', hidden: {3} ",
                                                item.Width,
                                                item.Sortable.ToString().ToLower(),
                                                item.Editable.ToString().ToLower(),
                                                (!item.Visible).ToString().ToLower());

                    if (item is KPItemTextModel)
                    {
                        var itemText = item as KPItemTextModel;
                        if (!itemText.Mask.Equals(KPMaskTypeClassEnum.ALPHANUMERIC))
                        {
                            sbColModel.Append(@",cellattr: function(rowId, val, rawObject) { return "" class='" + itemText.Mask.GetTypeValue() + @"'""; }");
                        }
                    }

                    sbColModel.Append("}");
                    #endregion
                }
            }
            catch (Exception ex)
            {
                throw new Exception(String.Format("Ocorreu um erro com o Campo: {0}. Verifica se a propriedade está de acordo com a Entidade {1}.", fieldNameTryException, this.TypeEntity), ex);
            }

            //Artigo interessante:
            //http://www.codeproject.com/Articles/58357/Using-jqGrid-s-search-toolbar-with-multiple-filter

            //Verifica posição da tela Find
            //http://www.ok-soft-gmbh.com/jqGrid/multisearchfilter.htm

            //http://trirand.com/blog/jqgrid/jqgrid.html

            KPSessionJQGrid sessionJQGrid = new KPSessionJQGrid()
            {
                SecuritySession = page.SecuritySession,
                TypeEntity = TypeEntity,
                SessionPageID = page.SessionPageID,
                MasterDetailID = MasterDetailID
            };
            string sessionUser = String.Empty;
            if (sessionJQGrid != null)
            {
                sessionUser = Convert.ToBase64String(SerializerHelper.SerializationObj(sessionJQGrid));
            }
            string propertyCompanyCrypt = String.Empty;
            if (!String.IsNullOrEmpty(PropertyCompanyEntity))
            {
                propertyCompanyCrypt = KPCryptography.EncryptStringAES(PropertyCompanyEntity);
            }
            string initialFilter = String.Empty;
            if (InitialFilter != null)
            {
                initialFilter = Convert.ToBase64String(SerializerHelper.SerializationObj(InitialFilter));
            }
            string initialOrder = String.Empty;
            if (InitialOrder != null)
            {
                initialOrder = Convert.ToBase64String(SerializerHelper.SerializationObj(InitialOrder));
            }

            StringBuilder buildGrid = new StringBuilder();
            buildGrid.Append(
            @"<script type=""text/javascript"">
            function GetcolModels() {
                var colModels = new Array();
                var colModelsObj = $('#" + tableID + @"').jqGrid('getGridParam', 'colModel');
                for (i=0;i<colModelsObj.length;i++)
                {colModels[i] = colModelsObj[i].name;}

                return colModels;
            }

            function successFunction(jsondata, stat) { 
                var thegrid = jQuery('#" + tableID + @"')[0];
                thegrid.addJSONData(JSON.parse(jsondata.d));
                setLoading(false);
            }

            function errorFunction(jsondata, stat) { 
                alertBox('Ops! Algum problema aconteceu com nosso servidor, por favor feche a tela e abra novamente.');
                setLoading(false);
            }

            function getGridData(pdata) {
                setLoading(true);
                $('#" + HiddenKey.ClientID + @"').val(null);
                var params = new Object();

                params.page = pdata.page;
                params.rows = pdata.rows;
                params.sidx = pdata.sidx;
                params.sord = pdata.sord;
                params._search = pdata._search;
                if (pdata.searchField != 'undefined')
                    params.searchField = pdata.searchField;
                if (pdata.searchOper != 'undefined')
                    params.searchOper = pdata.searchOper;
                if (pdata.searchString != 'undefined')
                    params.searchString = pdata.searchString;
                if (pdata.filters != 'undefined')
                    params.filters = pdata.filters;

                params.colModel = GetcolModels();
                params.user = '******';
                params.propertyCompany = '" + propertyCompanyCrypt + @"';
                params.initialFilter = '" + initialFilter + @"';
                params.initialOrder = '" + initialOrder + @"';

                $.ajax(
                {
                    url: '" + UrlService + @"',
                    data: JSON.stringify(params),
                    dataType: 'json',
                    type: 'POST',
                    contentType: 'application/json; charset=utf-8',
                    success: successFunction,
                    error: errorFunction
                });
            }
            
            var lastSel;

            function loadGrid" + tableID + @"(){
                $('#" + tableID + @"').jqGrid({
                    datatype: function (pdata) {getGridData(pdata);},
                    mtype : 'POST',
                    height: " + Height + @",
                    width: " + Width + @",
                    colNames: [" + sbColNames.ToString() + @"],
                    colModel: [" + sbColModel.ToString() + @"],
                    rowNum: " + RowNum.GetTypeValue() + @",
                    rowList: [" + GetRowList() + @"],
                    pager: '#" + pagerID + @"',
                    sortname: '" + sbSortName.ToString() + @"',
                    viewrecords: " + ViewTotalRecordsLabel.ToString().ToLower() + @",
                    sortorder: '" + OrderRecords.ToString().ToLower() + @"',
                    caption: '" + Caption + @"',
                    gridComplete: function() { generateMaskValidators(); },
                    onSelectRow: function(rowId)
                                 {
                                    if(rowId && rowId!==lastSel)
                                    { 
                                        jQuery(this).restoreRow(lastSel); 
                                        lastSel=rowId; 
                                    }
                                    $('#" + HiddenKey.ClientID + @"').val(rowId);
                                 },
                    ondblClickRow: function(rowId) 
                                {
                                    $('#" + HiddenKey.ClientID + @"').val(rowId);
                                    $('" + DoubleClickAction.GetTypeValue() + @"').click();
                                },

                });

                $('#" + tableID + @"').jqGrid('navGrid', '#" + pagerID + @"', { edit: false, add: false, del: false, search: true },{},{},{},
                    {
                        sopt:[" + this.JqGridSortType() + @"],
                        groupOps: [ { op: 'AND', text: 'E' }, { op: 'OR', text: 'OU' } ], 
                        multipleSearch: true, 
                        showQuery: false,
                        searchOnEnter: true,
                        closeOnEscape: false,
                        Reset: 'Limpar filtros'
                    }
                  );

                $('#" + tableID + @"').jqGrid('filterToolbar',{stringResult: true, searchOnEnter: true});

                $(window).bind('resize', function () {");

            if (string.IsNullOrWhiteSpace(this.MasterDetailID)) {
                buildGrid.Append(@"
                    $('#" + tableID + @"').jqGrid('setGridWidth', ($('#" + tableID + @"').closest('.Content').width()-2));
                    $('#" + tableID + @"').jqGrid('setGridHeight', ($('#" + tableID + @"').closest('.Content').height()-114));");
            } else {
                buildGrid.Append(@"
                    $('#" + tableID + @"').jqGrid('setGridWidth', ($('#" + tableID + @"').closest('.KPMasterDetailField').width()-2));
                    $('#" + tableID + @"').jqGrid('setGridHeight', ($('#" + tableID + @"').closest('.KPMasterDetailField').height()-105));");
            }

            buildGrid.Append(@"
                }).trigger('resize');
            }

            $(function () {
                loadGrid" + tableID + @"();
                var updatePanel = Sys.WebForms.PageRequestManager.getInstance();
                updatePanel.add_pageLoaded(loadGrid" + tableID + @");
            });

           </script>");
            return buildGrid.ToString();
            /*

            // Verificar o problema no Grid de sumir ao clicar em salvar
            // Sys.WebForms.PageRequestManager.getInstance().add_endRequest(function(){alert('teste');});

            */
        }