Ошибка e.Row.DataItem в событии gridview rowdatabound

введите здесь описание изображенияЯ хочу включить или отключить определенную строку в соответствии с входом в систему соответствующего пользователя. Итак, я использую событие rowdatabound, но у меня есть ошибка в этой строке:

DataRow drv = ((DataRowView)e.Row.DataItem).Row; 

Здесь e.Row.DataItem имеет связанную информацию о строке. Я контролировал, и он имеет значения строки. Но когда я хочу продолжить, я получаю эту ошибку:

Невозможно преобразовать объект типа «‹>f__AnonymousType014[System.Int32,System.Int32,System.String,System.String,System.DateTime,System.String,System.String,System.String,System.String,System.String,System.String,System.Nullable1[System.DateTime],System.String,System.Nullable`1[System.Boolean]]» в тип «System.Data.DataRowView».

Затем я изменил эту строку:

DataRowView drv = e.Row.DataItem as DataRowView;

Для этого условия он не выдает ошибки, но drv по-прежнему имеет нулевое значение. Dataitem не присваивает свое значение.

Здесь связанный полный код:

protected void gvListele_RowDataBound(object sender, GridViewRowEventArgs e)
{
    dbeDataContext db = new dbeDataContext();
    var c = (from v in db.CAGRIs where v.UserID != Convert.ToInt32(Session["user"]) select v).ToArray();
    if (c != null)
    {
        foreach (var item in c)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                 DataRow drv = ((DataRowView)e.Row.DataItem).Row; 

                int tempID = Convert.ToInt32(drv["CagriID"].ToString());
                if (item.CagriID == tempID)
                {
                    e.Row.Enabled = false;
                }
            }
        }
    }
}

Что я могу сделать для этой ошибки? Заранее спасибо.


person rockenpeace    schedule 14.01.2014    source источник
comment
Это не DataRowView, как вы уже заметили. Выберите источник данных, отличный от анонимного типа, и правильно его приведите. Что такое является DataSource в настоящее время?   -  person Tim Schmelter    schedule 14.01.2014
comment
что не так с DataRow drv = e.Row?   -  person Secret Squirrel    schedule 14.01.2014
comment
для лучшей производительности if statement должен быть вверху этого метода. прежде чем вы принесете все эти CARGIs   -  person Secret Squirrel    schedule 14.01.2014
comment
на самом деле, почему вы выбираете каждый RowDataBound, который выглядит как запрос, который должен был быть полностью выполнен вне этого метода.   -  person Secret Squirrel    schedule 14.01.2014
comment
я отредактировал, добавив изображение, чтобы показать элемент данных для источника данных.   -  person rockenpeace    schedule 14.01.2014


Ответы (2)


Я решил свою проблему два дня назад. Я использовал это:

int callID = Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "CagriID"));

Все событие:

    protected void gvListele_RowDataBound(object sender, GridViewRowEventArgs e)
{
    dbeDataContext db = new dbeDataContext();
    var c = (from v in db.CAGRIs where v.UserID != Convert.ToInt32(Session["user"]) select v).ToArray();
    if (c != null)
    {
        foreach (var item in c)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                int callID = Convert.ToInt32(DataBinder.Eval(e.Row.DataItem, "CagriID"));
                if (callID == item.CagriID)
                {
                    e.Row.Enabled = false;
                    continue;
                }
            }
        }
    }
}
person rockenpeace    schedule 16.01.2014

Вот несколько советов, которые могут помочь решить вашу проблему.

во-первых, когда вы выбираете var c, я бы поместил это за пределы этого метода. пока я буду использовать свойство

public object Cagris
{  
    get
    {
        if(_cagris == null)
        {
             _cagris =  (from v in db.CAGRIs 
                         where v.UserID != Convert.ToInt32(Session["user"]) // the session variable I would also have as a property rather than access it each time like this. 
                         select v).ToArray();
        }
        return _cagris;
    }
}


protected void gvListele_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {

        if (Cargis != null)
        {
            foreach (var item in Cargis)
            {
                //now you can either get the DataRow  
                DataRow dr = e.Row;
                int tempID = int.Parse((string)dr["CagriID"]);

                if (item.CagriID == tempID)
                {
                    e.Row.Enabled = false;
                }


                //or use the DataItem
                Cagris c = (Cagris)e.Row.DataItem;

                if (item.CagriID == c.CagriID)
                {
                    e.Row.Enabled = false;
                }

            }
        }
    }
}
person Secret Squirrel    schedule 14.01.2014
comment
я принимаю эту ошибку: не удается неявно преобразовать тип «System.Web.UI.WebControls.GridViewRow» в «System.Data.DataRow» для DataRow dr = e.Row; - person rockenpeace; 14.01.2014
comment
Для строки Cagris c = (Cagris)e.Row.DataItem я получаю эту ошибку: невозможно преобразовать объект типа '‹›f__AnonymousType014[System.Int32,System.Int32,System.String,System.String,System.DateTime,System.String,System.String,System.String,System.String,System.String,System.String,System.Nullable1[System.DateTime],System.String,System.Nullable`1[System.Boolean]] ', чтобы ввести 'КАГРИ'. - person rockenpeace; 14.01.2014