Невозможно привести анонимный объект к System.Data.DataRowView. - PullRequest
3 голосов
/ 18 февраля 2012

Я использую LINQ для 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, я вызываю следующий код, чтобы заполнить значение радиобаттониста

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, но к чему я могу привести, чтобы получить значение "which"

Ответы [ 2 ]

6 голосов
/ 18 февраля 2012

Вы должны определить правильный класс для описания ваших данных, и тогда вы сможете привести к этому классу.

// 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 (вам придется проверить).Противодействие этому подходу было бы в том случае, если ваш контейнер пользовательского интерфейса автоматически генерирует столбцы и , этот класс содержит больше данных, чем вы хотите отобразить, и в этом случае вы захотите продолжить проекцию в меньшую конструкцию.

0 голосов
/ 06 июля 2015

Ответ Энтони также отлично сработал для меня, хотя я делаю вещи немного по-другому.Моя цель - отображать информацию, связанную с подачей налоговых деклараций и электронными переводами средств.

Я использую RadioButtonList в шаблоне ItemTemplate.Каждый добавленный элемент имеет свое собственное значение («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 to 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;

Работает как шарм!

...