Передача ссылки на DataRow LINQ в ItemTemplate GridView - PullRequest
1 голос
/ 25 марта 2010

решено. Код отредактирован для отражения решения.

Учитывая следующее 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, ... );
}

Преобразование из DataRow в Listing не удалось (невозможно преобразовать из 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 ]

1 голос
/ 25 марта 2010

IIRC, вы должны просто позвонить Container.DataItem, и это будет Listing.

Попробуйте, выполнив <%# Container.DataItem.ToString() %> в качестве теста.

Я годами не пользовался ASP.NET, поэтому память может быть ржавой.

0 голосов
/ 25 марта 2010

<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( <b>Convert.ToInt23(Eval("Field1")),Eval("Field2").ToString(),Eval("Field3").ToString()</b> ) %>
    </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, ... );
}

0 голосов
/ 25 марта 2010

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 для предоставления его элементу управления.

...