2010-11-01 1 views
0

Я создал службу BCS и создал внешний список из типа содержимого BCS. Затем я попытался добавить элемент управления SPGridView в веб-страницу. Я получаю исключение, как только я называю DataBind() метод мои SPGridview «ы, вот что код выглядит следующим образом:Связывание внешнего (BCS) списка с SPDataGrid в Sharepoint 2010

namespace BCSService.CustomWebPart 
{ 
    [ToolboxItemAttribute(false)] 
    public class CustomWebPart : WebPart 
    { 
     // Visual Studio might automatically update this path when you change the Visual Web Part project item. 
     private const string _ascxPath = @"~/_CONTROLTEMPLATES/BCSShims/CustomWorkEstimateWebPart/CustomWorkEstimateWebPartUserControl.ascx"; 
     private SPGridView gv; 
     private SPDataSource spdata; 
     private SPSite site; 
     private SPWeb web; 
     private SPList we_list; 


    protected override void CreateChildControls() 
    { 
     base.CreateChildControls(); 
     Control control = Page.LoadControl(_ascxPath); 
     Controls.Add(control); 

     this.site = SPContext.Current.Site; 
     this.web = this.site.OpenWeb(); 
     this.we_list = this.web.Lists["BCSList"]; 

     this.spdata = new SPDataSource(); 
     Controls.Add(this.spdata); 

     this.gv = new SPGridView(); 
     this.gv.AutoGenerateColumns = false; 

     Controls.Add(this.gv);    
    } 

    protected void BindColumns() 
    { 
     this.spdata.DataSourceMode = SPDataSourceMode.List; 
     this.spdata.List = this.we_list; 
     this.spdata.UseInternalName = true; 
     this.spdata.DataBind(); 

     this.gv.AllowSorting = false; 
     this.gv.PageSize = 200; 
     this.gv.DataSource = this.spdata; 

     Dictionary<string, string> listFields = new Dictionary<string, string>(); 
     listFields.Add("CompanyName", "Company Name"); 
     listFields.Add("ContactDetails", "Contact Details"); 
     listFields.Add("ProjectDescription", "Description"); 

     foreach (var row in listFields) 
     { 
      SPBoundField boundField = new SPBoundField(); 
      boundField.HeaderText = row.Value; 
      boundField.DataField = row.Key; 
      this.gv.Columns.Add(boundField); 
     } 
    } 


    protected override void RenderContents(HtmlTextWriter writer) 
    { 

     if (!Page.IsPostBack) 
     { 
      this.BindColumns(); 
      this.gv.DataBind(); 
     } 

     this.gv.RenderControl(writer); 
    } 
} 

}

Метод DataBind() бросает следующее исключение:

Object reference not set to an instance of an object. 
    at Microsoft.SharePoint.WebControls.SPDataSourceViewResultItem.System.ComponentModel.ICustomTypeDescriptor.GetProperties() 
    at System.ComponentModel.TypeDescriptor.MergedTypeDescriptor.System.ComponentModel.ICustomTypeDescriptor.GetProperties() 
    at System.ComponentModel.TypeDescriptor.GetPropertiesImpl(Object component, Attribute[] attributes, Boolean noCustomTypeDesc, Boolean noAttributes) 
    at System.ComponentModel.TypeDescriptor.GetProperties(Object component) 
    at Microsoft.SharePoint.WebControls.SPBoundField.DataBindingEventHandler(Object sender, EventArgs e) 
    at System.Web.UI.Control.OnDataBinding(EventArgs e) 
    at System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) 
    at System.Web.UI.Control.DataBindChildren() 
    at System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) 
    at System.Web.UI.Control.DataBindChildren() 
    at System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) 
    at System.Web.UI.WebControls.GridView.CreateRow(Int32 rowIndex, Int32 dataSourceIndex, DataControlRowType rowType, DataControlRowState rowState, Boolean dataBind, Object dataItem, DataControlField[] fields, TableRowCollection rows, PagedDataSource pagedDataSource) 
    at System.Web.UI.WebControls.GridView.CreateChildControls(IEnumerable dataSource, Boolean dataBinding) 
    at Microsoft.SharePoint.WebControls.SPGridView.CreateChildControls(IEnumerable dataSource, Boolean dataBinding) 
    at System.Web.UI.WebControls.CompositeDataBoundControl.PerformDataBinding(IEnumerable data) 
    at System.Web.UI.WebControls.GridView.PerformDataBinding(IEnumerable data) 
    at System.Web.UI.WebControls.DataBoundControl.OnDataSourceViewSelectCallback(IEnumerable data) 
    at System.Web.UI.WebControls.DataBoundControl.PerformSelect() 
    at BCSService.CustomWebPart.CustomWorkEstimateWebPart.RenderContents(HtmlTextWriter writer) 

Я проверял, что this.we_list не является пустым (в Visual Studio отладчика locals вкладка, я вижу, this.we_list.Items.Count установлен в 99, хотя this.we_list.ItemCount is установлен в 0.)

Кроме того, это похоже на работу с внешними списками, но я ничего не вижу в документах о внешних списках, которые не поддерживаются в SPGridView или SPDataSource, и исключение не упоминает внешние списки не поддерживается. Кто-нибудь сталкивался с этой проблемой?

ответ

0

Возможно, это ошибка SharePoint SharePoint Server (я использую Sharepoint Server 2010 Enterprise Edition). В конечном итоге я решил проблему, добавив метод преобразования to_datatable() в мой объект службы BCS, который просто использует метод statis ReadList(), собирает его вывод и вставляет данные в объект DataTable.

Смежные вопросы