четверг, 20 ноября 2008 г.

DataViewWebPart insert trouble

Проблема возникла из ниоткуда, при стандартном развертывании узла из нашего шаблона на котором содержались веб части

DataViewWebPart и ListFormWebPart происходила ошибка при обращении к данной странице, самое смешное что на другой странице при использовании данного метода все работало. Так что пришлось применить жесткий Хак, создать обработчик на создание страниц 

OnActivated(

SPFeatureReceiverProperties properties) и в коде данного метода использовать методику Cut & Paste для изменения кода страницы. Проблема была в DataViewWebPart в чем там дело мы так и не разобрались так что пришлось сделать так, а не через обьектную модель WSS.

В ходе работы нашел несколько интересных и мало описанных решений для создания веб частей программным методом. Их я приведу ниже.

// Return a SharePoint list filtered by query as a data source

static SPDataSource GetDataSource(string dataSourceId, string webUrl, SPList list, string query, uint maximumRow)

{

SPDataSource dataSource = new SPDataSource();

dataSource.UseInternalName =

true;

dataSource.ID = dataSourceId;

dataSource.DataSourceMode =

SPDataSourceMode.List;

dataSource.List = list;

dataSource.SelectCommand =

"<View>" + query + "</View>";

Parameter listIdParam = new Parameter("ListID");

listIdParam.DefaultValue = list.ID.ToString(

"B").ToUpper();

Parameter maximumRowsParam = new Parameter("MaximumRows");

maximumRowsParam.DefaultValue = maximumRow.ToString();

QueryStringParameter rootFolderParam = new QueryStringParameter("RootFolder", "RootFolder");

dataSource.SelectParameters.Add(listIdParam);

dataSource.SelectParameters.Add(maximumRowsParam);

dataSource.SelectParameters.Add(rootFolderParam);

dataSource.UpdateParameters.Add(listIdParam);

dataSource.DeleteParameters.Add(listIdParam);

dataSource.InsertParameters.Add(listIdParam);

return dataSource;

}

// Create or Update a DataView programmatically

public static bool CreateOrUpdateDataViewWebpart(string webUrl, string listName, string pageUrl,

string xslLink,

string zoneName,

string webPartName,

string titleUrl,

bool needsUpdate,

string query,

uint index,

uint maximumRow,

PersonalizationScope personalizationScope

)

{

bool viewCreatedOrUpdated = false;

System.Web.UI.WebControls.WebParts.

WebPart wp = null;

wsswp.

DataFormWebPart dataFormWebPart = null;

using (SPSite site = new SPSite(webUrl))

using (SPWeb web = site.OpenWeb())

{

web.AllowUnsafeUpdates =

true;

SPList list = web.Lists[listName];

wsswp.

SPLimitedWebPartManager wpManager = web.GetLimitedWebPartManager(pageUrl, personalizationScope);

foreach (Microsoft.SharePoint.WebPartPages.WebPart wpTemp in wpManager.WebParts)

{

if (String.Compare(webPartName, wpTemp.Title, true) == 0)

{

wp = wpTemp;

break;

}

}

string dataSourceId = webPartName;

if (wp == null)

{

// Create a webpart

dataFormWebPart =

new wsswp.DataFormWebPart();

dataFormWebPart.TitleUrl = titleUrl;

dataFormWebPart.ZoneID = zoneName;

dataFormWebPart.Title = webPartName;

dataFormWebPart.XslLink = xslLink;

SPDataSource dataSource = GetDataSource(dataSourceId, webUrl, list, query, maximumRow);

dataFormWebPart.DataSources.Add(dataSource);

wpManager.AddWebPart(dataFormWebPart, webPartName, (

int)index);

viewCreatedOrUpdated =

true;

}

else

{

// Update an existing webpart

if (needsUpdate)

{

dataFormWebPart = (wsswp.

DataFormWebPart)wp;

dataFormWebPart.TitleUrl = titleUrl;

dataFormWebPart.DataSourceID =

string.Empty;

SPDataSource dataSource = GetDataSource(dataSourceId, webUrl, list, query, maximumRow);

dataFormWebPart.DataSources.Clear();

dataFormWebPart.DataSources.Add(dataSource);

wpManager.SaveChanges(dataFormWebPart);

viewCreatedOrUpdated =

true;

}

}

return viewCreatedOrUpdated;

 

}

}

Комментариев нет: