Crea vista dinamica per ListView Web Part
-
10-12-2019 - |
Domanda
Sto sfidando questo requisito:
Il client vuole mostrare solo gli elementi dell'elenco nella web part della vista elenco in base al valore dal profilo dell'utente e anche a preservare la funzionalità della web part della vista elenco come l'ordinamento dell'Oob e il filtro.Faccio qualche ricerca ed ecco la mia scoperta:
- .
- Provo a usare lo stesso approccio come elencato qui .Tuttavia questo approccio ha uno sconveniente molto brutto.Riascrive la vista su ogni pagina Aggiorna e lascia la query sulla vista in base alla proprietà del profilo utente dell'ultimo utente - non accettabile.
Pertanto vorrei generare come la vista sulla fly per questa parte web e applicare anche la query su di esso.Non vorrei modificare la vista originale sulla lista.
Qualche idea per favore?
Soluzione
Allora, l'ho risolto con il mio collega aiuto, per creare controlli figlio che seguo.Prendi lo schema XML dalla vista, sovrascrivere la query e passarla alla visualizzazione elenco.Nessuna nuova vista è stata creata e tutto funziona.
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);
. Altri suggerimenti
È possibile creare la visualizzazione dinamicamente. Non so di "Il client vuole mostrare solo elementi elenchi in elenco Visualizza web part basato sul valore dal profilo dell'utente". Ma è possibile verificare che supporti la visualizzazione denominata "clientView" nell'elenco se trovato cancellalo e crea una nuova vista con lo stesso nome per l'utente corrente.
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;
}
. Non sono sicuro se questo soddisfa le tue esigenze, ma non potresti farlo fuori dalla scatola con la parte web del filtro utente corrente.Esprime i dati del profilo utente per l'utente corrente, aggiungi una connessione all'elenco e filtrerà.