为ListView Web部件创建动态视图
-
10-12-2019 - |
题
我挑战这一要求:
客户端只想根据用户配置文件的值仅显示列表视图Web部件中的列表项,并保留列表视图Web部件的功能,如OOB排序和过滤。我做一些研究,这是我的发现:
- 我尝试使用与列出的相同的方法这里。然而,这种方法有一个非常丑陋的缺点。它将基于最后一个用户用户配置文件属性重写每个页面上的视图,并在视图上离开查询 - 不可接受。
因此,我想为此Web部分生成像持续的视图,也可以在其上应用查询。我不想编辑列表上的原始视图。
任何想法请?
解决方案
所以,我用我的同事帮助解决了它,在创建子控件上我遵循。从视图中拍摄架构XML,覆盖查询并将其传递给列表视图。没有创建新视图,一切都有效。
var obtainedList = elevatedWeb.GetListFromWebPartPageUrl(FullUrl);
if (obtainedList == null)
{
throw new Exception(string.Format(ListFromUrlNotObtained,FullUrl));
}
FullUrl = HttpUtility.UrlDecode(FullUrl);
var listViewWebPart = new ListViewWebPart();
listViewWebPart.WebId = elevatedWeb.ID;
listViewWebPart.ListId = obtainedList.ID;//.ToString("B").ToUpper();
var obtainedListView =obtainedList.Views.OfType<SPView>().FirstOrDefault<SPView>(lv => FullUrl.EndsWith(lv.Url));
if (obtainedListView == null)
{
throw new Exception(string.Format(ViewFromUrlNotObtained,FullUrl));
}
var html = obtainedListView.HtmlSchemaXml;
var xml = XElement.Parse(obtainedListView.HtmlSchemaXml);
xml.Attribute("Url").Remove();
xml.Element(XName.Get("Query")).SetValue(WildcardProcessor.ProcessQuery(FilterQuery));
var updatedXml = xml.ToString();
listViewWebPart.ListViewXml = updatedXml;
Controls.Add(listViewWebPart);
. 其他提示
您可以动态创建视图。 我不知道“客户想要只根据用户配置文件的值显示列表视图Web部件中的列表项”。 但是如果发现,可以检查名为“clientView”的假设“ClientView”的视图,如果发现删除它并为当前用户创建具有相同名称的新视图。
e.g。
SPList taskList = web.Lists[tasklistName];
string query = string.Empty;
if (taskList != null && taskList.ItemCount > 0)
{
query = "<OrderBy><FieldRef Name=\"Requirement_x0020_Details\" Ascending='TRUE'/></OrderBy><Where><Eq><FieldRef Name=\"Item_x0020_Type\"/><Value Type='Text'>Current</Value></Eq></Where>";
}
else
{
query = "<OrderBy><FieldRef Name=\"Requirement_x0020_Details\" Ascending='TRUE'/></OrderBy><Where><Eq><FieldRef Name=\"Task_x0020_Type\"/><Value Type='Text'>Current</Value></Eq></Where>";
}
StringCollection relevantColumns = CreateViewColumns();
SPView taskView = taskList.Views.Add("ClientView", relevantColumns, query, rowCount, true, false);
private StringCollection CreateViewColumns()
{
StringCollection viewFieldsCollection = new StringCollection();
string tasksColumns = "Requirement_x0020_Details;DocIcon;LinkTitle;AssignedTo;Status;Priority;DueDate;PercentComplete";
string[] columns = tasksColumns.Split(';');
foreach (string column in columns)
{
viewFieldsCollection.Add(column);
}
return viewFieldsCollection;
}
. 我不确定这是否满足您的要求,但您无法使用当前用户过滤器Web部件开箱即用。它公开了当前用户的用户配置文件数据,然后添加到列表的连接,它将过滤。