在GridView ItemTemplate中传递LINQ DataRow引用

时间:2010-03-25 12:08:53

标签: c# asp.net linq-to-sql dataset itemtemplate

已解决。代码已经过编辑以反映解决方案。

鉴于以下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, ... );
}

DataRowListing的演员表失败(无法从DataRow转换为Listing)我确定问题在于我从内部传递的内容ItemTemplate,它不是我创建的LINQ to 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();
    }
}

3 个答案:

答案 0 :(得分:1)

IIRC,您应该致电Container.DataItem,这将是Listing

通过<%# Container.DataItem.ToString() %>作为测试来尝试。

我多年来没有使用过ASP.NET,因此内存可能会生锈。

答案 1 :(得分: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将其提供给控件。

答案 2 :(得分: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, ... );
}