2017-05-17 4 views
1

従来のWebformコードを少し更新しています。古いDataGridを更新して最新のGridViewを使用しています。型付きモデル結合。強力な型のGridViewにデータテーブルをバインドすることができません

MyCustomCollectionType data = GetFromDataSource(); 
MyGridView.DataSource = data; 
MyGridView.DataBind(); 

をし、Webフォームのようなものになります。:カスタマイズされたDataTableをプログラム的にGridViewにバインドされている

<asp:GridView runat="server" ID="MyGridView" ItemType="MyCustomCollectionType.MyCustomRow"> 
    <Columns> 
     <asp:TemplateField> 
      <ItemTemplate> 
       <%#: Item.ID %> : <%#: Item.Name %> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

をしかしDataBindを()が呼び出されたときに、何らかの理由で、私は次の例外を取得します:私はOnRowDataBoundイベントハンドラを追加し、RowTypeをチェックすると

[InvalidCastException: Unable to cast object of type 'System.Data.DataRowView' to type 'MyCustomRow'.] 
    ASP.Test_aspx.__DataBind__control54(Object sender, EventArgs e) in D:\Bit\MyRepo\MyProject\Test.aspx:130 
    System.Web.UI.Control.OnDataBinding(EventArgs e) +84 
    System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) +150 
    System.Web.UI.Control.DataBind() +17 
    System.Web.UI.Control.DataBindChildren() +185 
    System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) +160 
    System.Web.UI.Control.DataBind() +17 
    System.Web.UI.Control.DataBindChildren() +185 
    System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) +160 
    System.Web.UI.Control.DataBind() +17 
    System.Web.UI.Control.DataBindChildren() +185 
    System.Web.UI.Control.DataBind(Boolean raiseOnDataBinding) +160 
    System.Web.UI.Control.DataBind() +17 
    System.Web.UI.WebControls.GridView.CreateRow(Int32 rowIndex, Int32 dataSourceIndex, DataControlRowType rowType, DataControlRowState rowState, Boolean dataBind, Object dataItem, DataControlField[] fields, TableRowCollection rows, PagedDataSource pagedDataSource) +167 
    System.Web.UI.WebControls.GridView.CreateChildControls(IEnumerable dataSource, Boolean dataBinding) +3721 
    System.Web.UI.WebControls.CompositeDataBoundControl.PerformDataBinding(IEnumerable data) +67 
    System.Web.UI.WebControls.GridView.PerformDataBinding(IEnumerable data) +14 
    System.Web.UI.WebControls.DataBoundControl.OnDataSourceViewSelectCallback(IEnumerable data) +128 
    System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback) +34 
    System.Web.UI.WebControls.DataBoundControl.PerformSelect() +143 
    System.Web.UI.WebControls.BaseDataBoundControl.DataBind() +74 
    System.Web.UI.WebControls.GridView.DataBind() +9 

は、私はしかし、Sとして、それはHeader OKをデータバインディング見ることができますそれが実際のDataRowに当たると例外がスローされます。私がデータバインディング式を完全に削除して静的テキストを入れると、例外がなくなり、静的テキストの予想される行数が得られます。

どのように間違っているのか分かりますか?

更新

私が代わりに<asp:TemplateField><asp:BoundField DataField="ID" /><asp:BoundField DataField="Name" />を使用している場合興味深いことに、その後、エラーはありません。それは、データバインディング式が呼び出されて例外が発生したときだけです。

答えて

1

リストをバインドする予定のGridViewにDataTableをバインドしています。 this exampleのようにGridViewを使用するか、ItemTypeプロパティを使用せず、データバインディングにEvalを使用してください。

public class SalesPerson 
{ 
    public string SalesPersonID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

List<SalesPerson> salesFolks = new List<SalesPerson>() 

GridView1.DataSource = salesFolks; 
GridView1.DataBind(); 

<asp:GridView ID="GridView1" runat="server" ItemType="SalesPerson"> 
    <Columns> 
     <asp:TemplateField> 
      <ItemTemplate> 
       <%# Item.FirstName %> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

OR

GridView1.DataSource = myDataTable; 
GridView1.DataBind(); 

<asp:GridView ID="GridView1" runat="server"> 
    <Columns> 
     <asp:TemplateField> 
      <ItemTemplate> 
       <%#: Eval("FirstName") %> 
      </ItemTemplate> 
     </asp:TemplateField> 
    </Columns> 
</asp:GridView> 

私は最初のGridViewの例を試みたが、それにDataTableをバインドしようとしたとき、私はそのエラーを得ました。

関連する問題