Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法将匿名对象强制转换为System.Data.DataRowView_C#_Asp.net_Linq To Sql - Fatal编程技术网

C# 无法将匿名对象强制转换为System.Data.DataRowView

C# 无法将匿名对象强制转换为System.Data.DataRowView,c#,asp.net,linq-to-sql,C#,Asp.net,Linq To Sql,我使用linq to sql来填充gridview: 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.

我使用linq to sql来填充gridview:

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'.
无法将类型为“f__AnonymousType1”3[System.Int32,System.Int16,System.String]的对象强制转换为类型为“System.Data.DataRowView”。

我知道匿名对象不能强制转换到datarowview,但是为了获得“which”的值,我可以强制转换到什么?您应该定义一个合适的类来描述您的数据,然后您就可以强制转换到这个类

// 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); 

还有其他的技巧来处理这个问题,比如使用<代码>动态< /C> >并让运行时解决它,或者使用<代码> CasByStase方法(你可以查一下,但是我认为它很容易破解),但是在我看来这是最干净的事情。


您也可以简单地省略投影并使用完整对象

select r;

此时,您只需转换为
db.MyForm1\u hosps
中的元素类型,这大概就是
MyForm1\u hosps
(您必须验证)。如果你的UI容器是自动生成列的,并且这个类包含的数据比你希望显示的要多,那么反对这种方法的方法是,在这种情况下,你会希望继续投影到一个更小的结构中。

Anthony的回答对我来说也很好,尽管我做的事情略有不同。我的目标是显示与税务申报和电子资金转账相关的信息

我在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>
然后将LINQ修改为SQL以选择该类的新实例(辖区、实体、分类类型,并返回此处未显示的所有引用联接)

然后在我的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;

工作起来很有魅力

这看起来不错。我要到星期一才能尝试这个方法,如果它有效的话,我会把它标记为已回答(应该是这样)。两者都有效。我选择了第二个,因为我有5个GridView,不想创建5个类。谢谢
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();
RadioButtonList rdoPayEstbyEFT = (RadioButtonList)e.Row.FindControl("rdoPayEstbyEFT");

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