2012-02-17 63 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; 

工程就像一个魅力!