2012-02-17 106 views
3

我使用LINQ to SQL中填寫一個GridView:無法投匿名對象System.Data.DataRowView

var results = from r in db.MyForm1_hosps 
         where r.recordId == recordId 
         orderby r.hospId 
         select new { r.hospId, r.which, r.description }; 

     if (results.Count() > 0) 
     { 
      Form_1_hosp.DataSource = results; 
      Form_1_hosp.DataBind(); 
     } 

OnRowDataBound在以後,我調用下面的代碼填寫在RadioButtonList的

的價值
if (e.Row.RowType == DataControlRowType.DataRow) 
     { 
      RadioButtonList rbl = e.Row.FindControl("which") as RadioButtonList; 
      if (rbl != null) 
      { 
       DataRowView rowView = (DataRowView)(e.Row.DataItem); 
       LoadRadioButtonList(rowView["which"], rbl); 
      } 
     } 

我得到以下錯誤:

Unable to cast object of type '<>f__AnonymousType1`3[System.Int32,System.Int16,System.String]' to type 'System.Data.DataRowView'. 

我明白,一個匿名的對象不能投到datarowview,但我可以施加什麼,以獲得「哪個」的值

回答

6

您應該定義一個適當的類來描述您的數據,然後您將能夠投射到這個類。

// replace with proper names and types, as appropriate 
class MyData 
{ 
    public int HospId { get; set; } 
    public string Which { get; set; } 
    public string Description { get; set; } 
} 

更新查詢的select利用這一類投影

select new MyData 
{ 
    HospId = r.hospId, 
    Which = r.which, 
    Description = r.description 
}; 

然後使用類型的演員。

MyData obj = (MyData)(e.Row.DataItem); 
LoadRadioButtonList(obj.Which, rbl); 

還有其他一些技術來處理這個問題,如使用dynamic,並讓運行時算起來,或使用CastByExample<T>方法(你可以看看它,但我認爲這是faily砍十歲上下),但在我看來這是最乾淨的事情。


你可以爭論也只是省略了投影和使用完整的對象

select r; 

此時您只需將轉換爲在db.MyForm1_hosps元素的類型,這大概是MyForm1_hosp(你會必須驗證)。如果你的用戶界面容器是自動生成的列這個類包含的數據比你想要顯示的數據更多,在這種情況下,你會想要繼續投影到一個更小的結構中。

+0

這看起來不錯。我不會在星期一之前嘗試這種方式,並且如果它有效(它應該)會標記爲已回答。 – peroija 2012-02-17 23:45:43

+0

都有效。因爲我有5個gridviews,我不想創建5個類,所以我選擇了第二個。謝謝! – peroija 2012-02-20 13:25:46

0

安東尼的答案對我來說也很完美,儘管我的做法略有不同。我的目標是顯示與稅務申報和電子資金轉賬相關的信息。

我在ItemTemplate中使用RadioButtonList。每個添加的項目都有它自己的值(「Y」或「N」),它與存儲在數據庫中的字符串相對應。

<asp:TemplateField HeaderStyle-CssClass="TableHeader" HeaderText="Pay Estimate by EFT?" ItemStyle-HorizontalAlign="Center"> 
    <ItemTemplate> 
     <asp:RadioButtonList ID="rdoPayEstbyEFT" runat="server"> 
      <asp:ListItem Value="Y">Yes</asp:ListItem> 
      <asp:ListItem Value="N">No</asp:ListItem> 
     </asp:RadioButtonList> 
    </ItemTemplate> 
</asp:TemplateField> 

我創建了一個名爲EFT類來定義所有的數據,我檢索我的LINQ到SQL語句

public class EFT 
{ 
    public int JUR_ID {get; set;} 
    public string JUR_NAME {get; set;} 
    public DateTime FYE {get; set;} 
    public int STATE {get; set;} 
    public string ENT_NAME { get; set; } 
    public string ENT_ABBREV { get; set; } 
    public string TYPE_NAME { get; set; } 
    public int RETURN_ID { get; set; } 
    public string EFT_EST { get; set; } 
    public string EFT_EXT { get; set; } 
    public string EFT_RETURN { get; set; } 
} 

然後修改了的LINQ to SQL來選擇類的新實例(管轄權,實體,稅種,並返回所有未在此處顯示的參考連接)。

select new EFT {JUR_ID = jurisdictions.ID, JUR_NAME = jurisdictions.NAME, FYE = jurisdictions.FYE.Value , STATE = jurisdictions.STATE.Value , ENT_NAME = (entity.NAME.Contains(",") ? entity.NAME.Substring(0, entity.NAME.IndexOf(",") -1).ToString() : entity.NAME), ENT_ABBREV = entity.ABBREV, TYPE_NAME = taxtypes.TYPE, RETURN_ID = returns.RETURN_ID.Value, EFT_EST = returns.EFT_EST, EFT_EXT = returns.EFT_EXT, EFT_RETURN = returns.EFT_RETURN } 
            ).ToList(); 

然後在我的RowDataBound我提取「Y」或從數據庫中「N」值和分配該字符串爲所選值。

RadioButtonList rdoPayEstbyEFT = (RadioButtonList)e.Row.FindControl("rdoPayEstbyEFT"); 

EFT rowView = (EFT)e.Row.DataItem; 
string strESTbyEFT = rowView.EFT_EST.ToString(); 
rdoPayEstbyEFT.SelectedValue = strESTbyEFT; 

工程就像一個魅力!