无法将匿名对象强制转换为System.Data.DataRowView
本文关键字:转换 System Data DataRowView 对象 | 更新日期: 2023-09-27 18:24:56
我使用linq到sql来填充网格视图:
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中,我调用以下代码来填充单选按钮列表的值
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,但我可以强制转换为什么才能获得
您应该定义一个合适的类来描述您的数据,然后您就可以强制转换到此类。
// 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>
方法(你可以查找它,但我认为它很难破解),但在我看来,这是最干净的做法
可以说,你也可以简单地省略投影,使用全对象
select r;
这时,您只需转换为db.MyForm1_hosps
中元素的类型,大概就是MyForm1_hosp
(您必须验证)。反对这种方法的方法是,如果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>
我创建了一个名为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;
工作起来很有魅力!