2

场景:我需要根据选定的过滤器刷新/过滤在同一页面上的列表视图 Web 部件中显示的项目/记录。所以我创建了 Visual Web Part 并尝试以编程方式修改 List View Web Part 的视图。到目前为止,我已经到达这里:

string spListName = "Job";

protected void BtnSearchClick(object sender, EventArgs e)
{
    try
    {
    SPWeb oWebsite = SPContext.Current.Web;
    SPList oList = oWebsite.Lists[spListName];
    XsltListViewWebPart xsltWP = null;

    SPWebPartManager wpManager = WebPartManager.GetCurrentWebPartManager(Page) as SPWebPartManager;

    //Code to Find List View Web Part on Page
    foreach (System.Web.UI.WebControls.WebParts.WebPart wp in wpManager.WebParts)
    {
        if (wp.GetType().Name == "XsltListViewWebPart")
            xsltWP = wp as XsltListViewWebPart;
    }

    oWebsite.AllowUnsafeUpdates = true;

    StringBuilder strbPreQuery = new StringBuilder("<Where><Eq>");

    StringBuilder strbPostQuery = new StringBuilder("</Value></Eq></Where>");

    string strQueryKeyword = "<FieldRef Name='Customer' /><Value Type='Lookup'>";

    SPQuery oQuery = new SPQuery();
    oQuery.Query = strbPreQuery.ToString() + strQueryKeyword + txtCustomer.Text + strbPostQuery.ToString();
    SPListItemCollection itemCol = oWebsite.Lists[spListName].GetItems(oQuery);

    PropertyInfo pi = xsltWP.GetType().GetProperty("ContextView", BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance);
    SPView view = (SPView)(pi.GetValue(xsltWP, null));

    view.Query = oQuery.Query;
    view.Update();

    wpManager.SaveChanges(xsltWP);
    xsltWP.DataBind();

    oWebsite.AllowUnsafeUpdates = false;

}

catch (Exception ex)
{
    Response.Write(ex);
}
}

上面的代码有效,但现在我面临以下问题:

  1. 结果更新需要刷新页面,因此如果我添加以下代码,结果会更新,但可视 Web 部件中的过滤器值会丢失

    this.Context.Response.Redirect(this.Context.Request.Url.ToString());
    
  2. 一个用户应用的过滤也反映给另一个用户。

有人可以帮助解决我遇到的这两个问题吗?那就是我想要的

  1. 保留要同时修改的过滤器值和结果
  2. 过滤应该只针对一个用户,而不是针对所有用户。

在这方面的任何帮助将不胜感激。

4

1 回答 1

-1

创建一个将保存视图默认值的 SPQuery。然后在传递值之后,使用它来恢复视图的默认查询。

SPView _view;

protected void Page_Unload(object sender, EventArgs e)
{
    //your code
    SPView view = (SPView)(pi.GetValue(xsltWP, null));
    view.Query = _view.Query;
    view.Update();
}
于 2015-02-06T07:46:08.653 回答