2010-03-25 2 views
1

해결되었습니다. 코드가 솔루션을 반영하도록 편집되었습니다.GridView의 ItemTemplate에서 LINQ DataRow 참조 전달

주어진 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, ...); 
} 
Listing- DataRow에서 캐스팅 ( DataRow에서 Listing로 변환 할 수 없습니다) 실패했다

I '문제는 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(); 
    } 
} 

답변

1

IIRC, 당신은 단지 Container.DataItem를 호출해야하고는 Listing 될 것입니다.

<%# Container.DataItem.ToString() %>을 테스트하여 사용해보십시오.

몇 년 동안 ASP.NET을 사용하지 않았기 때문에 메모리가 녹슬 수 있습니다.

+0

그것은 모든 갔다있어 그! 고맙습니다! LINQ와 다른 종류의 DataSets를 사용하는 것이 얼마나 간단한 지 감동했습니다. –

+0

@Bob Kaufman : 물론 간단합니다 :) 당신은 단지 어떻게 알아야합니다. – leppie

0

LINQ to SQL은 DataRow 클래스를 전혀 사용하지 않습니다.

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

을 각 개체는 내가 뭔가를 놓친 거지하지 않는 한

, 당신은 할 수 있습니다 ... 자신의 클래스와 어떤 기본 클래스가 없다, 그래서 당신은 DataRow를 같은 SQL 개체에 LINQ를 캐스팅 할 수 없습니다 및

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

또한 RowDataBound에 부착 e.Row.DataItem 통해 현재 결합 된 객체에 액세스하고 e.Row.Cells []를 통해 셀에 값을 제공 할 때 사용하고 값을 공급할 수있다 바운드 필드의 텍스트 속성에 추가하거나 FindControl을 사용하여 컨트롤에 제공합니다.

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, ...); 
} 

+0

좋은 생각이지만 목록에서 여러 필드를 사용하여 데이터 유형을 보존하려고합니다. –

+0

이 메서드는 예제 일 뿐이며 메서드에 매개 변수를 사용할 수 있습니다 –