Problème de filtrage de la grille SP
-
10-12-2019 - |
Question
J'ai la page de la grille SP dans ma page d'application, je lie certaines données à la grille SP Grid Vie, je veux maintenant appliquer le filtrage pour cette grille.Je essayé le code suivant, je reçois une erreur lorsque je clique sur le bouton de filtragedans la vue de la grille comme indiqué dans l'image ci-dessous.Aidez-moi, s'il vous plaît.Je suis frappé avec ce problème depuis 2 jours
J'ai utilisé le code suivant pour filtrer
string FilterExpression
{
get
{
if (ViewState["FilterExpression"] == null)
{
ViewState["FilterExpression"] = "";
}
return (string)ViewState["FilterExpression"];
}
set
{
string thisFilterExpression = "(" + value.ToString() + ")";
List<string> fullFilterExpression = new List<string>();
if (ViewState["FilterExpression"] != null)
{
string[] fullFilterExp = ViewState["FilterExpression"].ToString().Split(_ssep, StringSplitOptions.RemoveEmptyEntries);
fullFilterExpression.AddRange(fullFilterExp);
//if the filter is gone expression already exist?
int index = fullFilterExpression.FindIndex(s => s.Contains(thisFilterExpression));
if (index == -1)
{ fullFilterExpression.Add(thisFilterExpression); }
}
else
{
fullFilterExpression.Add(thisFilterExpression);
}
//loop through the list<T> and serialize to string
string filterExp = string.Empty;
fullFilterExpression.ForEach(s => filterExp += s + " AND ");
filterExp = filterExp.Remove(filterExp.LastIndexOf(" AND "));
if (!filterExp.EndsWith("))") && filterExp.Contains("AND"))
{
filterExp = "(" + filterExp + ")";
}
ViewState["FilterExpression"] = filterExp;
}
}
public DataTable GetDataForFiltering()
{
string siteUrl = SPContext.Current.Web.Url;
using (SPSite oSite = new SPSite(siteUrl))
{
using (SPWeb oWeb = oSite.OpenWeb())
{
SPList oListSCat = oWeb.Lists["listHelpDesk"];
SPListItemCollection olistItemColl = oListSCat.Items;
if (!dt.Columns.Contains("Functional Area"))
{
dt.Columns.Add("FunctionalArea");
}
if (!dt.Columns.Contains("Category"))
{
dt.Columns.Add("Category");
}
if (!dt.Columns.Contains("SubCategory"))
{
dt.Columns.Add("SubCategory");
}
if (!dt.Columns.Contains("Tier"))
{
dt.Columns.Add("Tier");
}
//if (!dt.Columns.Contains("Region"))
//{
// dt.Columns.Add("Region");
//}
if (!dt.Columns.Contains("Status"))
{
dt.Columns.Add("Status");
}
if (!dt.Columns.Contains("Subject"))
{
dt.Columns.Add("Subject");
}
if (!dt.Columns.Contains("Description"))
{
dt.Columns.Add("Description");
}
if (!dt.Columns.Contains("Attachments"))
{
dt.Columns.Add("Attachments");
}
foreach (SPListItem listItem in olistItemColl)
{
DataRow dr = dt.NewRow();
string fncArea = listItem["Functional Area"].ToString();
dr["FunctionalArea"] = fncArea.Split('#')[1];
string cat = listItem["Category"].ToString();
dr["Category"] = cat.Split('#')[1];
string scat = listItem["Subcategory"].ToString();
dr["SubCategory"] = scat.Split('#')[1];
string tier = listItem["Tier"].ToString();
dr["Tier"] = tier.Split('#')[1];
//string region = listItem["Region"].ToString();
//dr["Region"] = region.Split('#')[1];
dr["Status"] = listItem["Status"].ToString();
dr["Subject"] = listItem["Subject"].ToString();
dr["Description"] = listItem["Description"].ToString();
dr["Attachments"] = "Download link";
dt.Rows.Add(dr);
}
return dt;
}
}
}
public void Filtering()
{
try
{
objDS = new ObjectDataSource();
objDS.ID = "objDSWaitingApprovals";
objDS.SelectMethod = "GetDataForFiltering";
objDS.TypeName = this.GetType().AssemblyQualifiedName;
objDS.EnableViewState = false;
//pass the SortExpression to the select method
//objDS.SortParameterName = "SortExpression";
//this resets the dropdown options for other columns after a filter is selected
objDS.FilterExpression = FilterExpression;
//add the data source
Controls.Add(objDS);
spgrdView.EnableViewState = false;
//filtering
spgrdView.AllowFiltering = true;
spgrdView.FilterDataFields = "FunctionalArea,Category,SubCategory,Tier,Subject,Description,Attachments,Status";
spgrdView.FilteredDataSourcePropertyName = "FilterExpression";
spgrdView.FilteredDataSourcePropertyFormat = "{1} = '{0}'";
spgrdView.DataSourceID = objDS.ID;
spgrdView.DataBind();
}
catch (Exception ex)
{
Page.ClientScript.RegisterClientScriptBlock(typeof(SPAlert), "alert", "<script language=\"javascript\">alert('" + ex.Message + " .')</script>");
}
}
public void spgrdView_OnRowDataBound(object sender, GridViewRowEventArgs e)
{
//if (sender == null || e.Row.RowType != DataControlRowType.Header)
//{
// return;
//}
SPGridView grid = sender as SPGridView;
if (String.IsNullOrEmpty(grid.FilterFieldName))
{
return;
}
// Show icon on filtered column
for (int i = 0; i < grid.Columns.Count; i++)
{
DataControlField field = grid.Columns[i];
if (field.SortExpression == grid.FilterFieldName)
{
Image filterIcon = new Image();
filterIcon.ImageUrl = "/_layouts/images/filter.gif";
filterIcon.Style[HtmlTextWriterStyle.MarginLeft] = "2px";
// If we simply add the image to the header cell it will
// be placed in front of the title, which is not how it
// looks in standard SharePoint. We fix this by the code
// below.
Literal headerText = new Literal();
headerText.Text = field.HeaderText;
PlaceHolder panel = new PlaceHolder();
panel.Controls.Add(headerText);
panel.Controls.Add(filterIcon);
e.Row.Cells[i].Controls[0].Controls.Add(panel);
break;
}
}
}
La solution
Utilisez la partie Web plutôt que la page d'application.
J'ai utilisé une partie Web sa fonction de travail pour moi maintenant.
Autres conseils
Le contrôle DataGridView fournit la prise en charge de filtrage des données girding plus que,contient, moins de, est égal à et plus de conditions.