1

解决了。代码已被编辑以反映解决方案。

鉴于以下情况GridView

<asp:GridView runat="server" ID="GridView1" AutoGenerateColumns="false" DataKeyNames="UniqueID"
        OnSelectedIndexChanging="GridView1_SelectedIndexChanging" >
<Columns>
    <asp:BoundField HeaderText="Remarks" DataField="Remarks" />
    <asp:TemplateField HeaderText="Listing">
    <ItemTemplate>
        <%# ShowListingTitle( Container.DataItem ) %>
    </ItemTemplate>
    </asp:TemplateField>
    <asp:BoundField HeaderText="Amount" DataField="Amount" DataFormatString="{0:C}" />
</Columns>
</asp:GridView>

它指的是以下代码隐藏方法:

protected String ShowListingTitle( object /* was DataRow */ row )
{
    Listing listing = ( Listing ) row;

    return NicelyFormattedString( listing.field1, listing.field2, ... );
}

DataRowtoListing的转换失败(无法从DataRowto转换Listing)我确定问题出在我从 ItemTemplate 中传递的内容上,这根本不是对我从 LINQ 到 SQL 数据集的当前记录的正确引用'已经创建,它看起来像这样:

private void PopulateGrid()
{
    using ( MyDataContext context = new MyDataContext() )
    {
        IQueryable < Listing > listings = from l in context.Listings where l.AccountID == myAccountID select l;

        GridView1.DataSource = listings;
        GridView1.DataBind();
    }
}
4

3 回答 3

1

IIRC,你应该只是打电话Container.DataItem,那将是一个Listing.

<%# Container.DataItem.ToString() %>通过做一个测试来尝试它。

不过我已经好几年没用过 ASP.NET 了,所以内存可能会生锈。

于 2010-03-25T12:12:45.670 回答
0

LINQ to SQL 根本不使用 DataRow 类;每个实体都是它自己的类并且没有基类,因此您不能将 LINQ to SQL 对象转换为 DataRow ...

除非我遗漏了什么,否则你可以这样做:

<%# ShowListingTitle( ( ( Listing ) ( Container.DataItem ) ).Row ) %>

protected String ShowListingTitle( Listingrow )
{
    return NicelyFormattedString( listing.field1, listing.field2, ... );
}

您还可以附加到 RowDataBound 并通过 e.Row.DataItem 访问当前绑定的对象,然后使用它通过 e.Row.Cells[] 向单元格提供值并为 text 属性提供值(对于绑定字段)或使用 FindControl 将其提供给控件。

于 2010-03-25T12:17:49.777 回答
0

<asp:GridView runat="server" ID="GridView1" AutoGenerateColumns="false" DataKeyNames="UniqueID"
        OnSelectedIndexChanging="GridView1_SelectedIndexChanging" >
<Columns>
    <asp:BoundField HeaderText="Remarks" DataField="Remarks" />
    <asp:TemplateField HeaderText="Listing">
   <
        <%# ShowListingTitle( Convert.ToInt23(Eval("Field1")),Eval("Field2").ToString(),Eval("Field3").ToString() ) %>
    </ItemTemplate>
    </asp:TemplateField>
   <asp:BoundField HeaderText="Amount" DataField="Amount" DataFormatString="{0:C}" />
</Columns>
</asp:GridView>

并将您的方法更改为:


protected String ShowListingTitle( int field1,string field2 )
{
    Listing listing = ( Listing ) row;

    return NicelyFormattedString( listing.field1, listing.field2, ... );
}

于 2010-03-25T12:18:25.270 回答