我想根据登录的相关用户启用或禁用特定行。所以我使用rowdatabound事件,但我在这一行有一个错误:
DataRow drv = ((DataRowView)e.Row.DataItem).Row;
在这里,e.Row.DataItem具有相关的行信息。我控制了它,它有行的值。但是当我想继续时,我会接受这个错误:
无法将类型为'<> f__AnonymousType0
14[System.Int32,System.Int32,System.String,System.String,System.DateTime,System.String,System.String,System.String,System.String,System.String,System.String,System.Nullable
1 [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;
}
}
}
}
}
我可以为此错误做些什么?提前谢谢。
答案 0 :(得分:10)
我两天前解决了我的问题。我用过这个:
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;
}
}
}
}
}
答案 1 :(得分:1)
以下是一些可能有助于解决问题的建议。
首先选择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;
}
}
}
}
}