系统浏览/编辑都没问题,但我想新增一行(触发addrow)时,却提示了下列错误:
如果删除ItemDataBound语句,则新增一行(触发addrow)没问题.要怎么解决???





说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.InvalidCastException: 指定的转换无效。源错误: 
行 347:
行 348: DataRowView drv = (DataRowView)e.Item.DataItem;
行 349: string COLOURS = (string)drv["S_FLAG_COLOUR"];
行 350:  源文件: c:\wk\webapplicationcsharp\sales.aspx.cs    行: 349 



public void addrow(object s,EventArgs e)
{    

DataTable dt=(DataTable)Session["MY_SALES"];
DataRow dr=dt.NewRow();
dt.Rows.Add(dr);

this.SALES.DataSource=dt;
this.SALES.DataKeyField = "S_ID";
this.SALES.DataBind();

//为添加的新行打开编辑模式
this.SALES.EditItemIndex = SALES.Items.Count - 1;
this.SALES.DataBind();
LBTN_Add.Visible = false;

}
public void SALES_ItemDataBound(object sender, DataGridItemEventArgs e)
{ if (e.Item.ItemType == ListItemType.Item)
{
DataRowView drv = (DataRowView)e.Item.DataItem;
string COLOURS = (string)drv["S_FLAG_COLOUR"];

switch (COLOURS)
{
case "0":
{e.Item.ForeColor = Color.Black;
e.Item.ForeColor = Color.Black;
}

break;
case "1":
{
e.Item.ForeColor = Color.Red;
e.Item.ForeColor = Color.Red;}
break;
case "2":
{
e.Item.ForeColor = Color.DeepPink;
e.Item.ForeColor = Color.DeepPink;}
break;

}
}

}

解决方案 »

  1.   

    (string)drv["S_FLAG_COLOUR"]->drv["S_FLAG_COLOUR"].ToString()
      

  2.   

    public void SALES_ItemDataBound(object sender, DataGridItemEventArgs e)
    {
    if((e.Item.ItemType == ListItemType.Item) || 
                 (e.Item.ItemType == ListItemType.AlternatingItem))
             {
    DataRowView drv = (DataRowView)e.Item.DataItem;
                      string COLOURS ="";
                      if(drv!=null)
                      {
        COLOURS = Convert.ToString(drv["S_FLAG_COLOUR"]);
                          switch (COLOURS)
       {
    case "0":
    {e.Item.ForeColor = Color.Black;
    e.Item.ForeColor = Color.Black;
    }
    break;
    case "1":
    {
    e.Item.ForeColor = Color.Red;
    e.Item.ForeColor = Color.Red;}
    break;
    case "2":
    {
    e.Item.ForeColor = Color.DeepPink;
    e.Item.ForeColor = Color.DeepPink;}
    break;
    }
                      }
             }
    }
    改成这样试试
      

  3.   

    singlepine(小山) 大哥正解。
      

  4.   

    用DataRowView drv = e.Item.DataItem as DataRowView;更合理!!
    public void SALES_ItemDataBound(object sender, DataGridItemEventArgs e)
    {
    if((e.Item.ItemType == ListItemType.Item) || 
                 (e.Item.ItemType == ListItemType.AlternatingItem))
             {
    DataRowView drv = e.Item.DataItem as DataRowView;
                      string COLOURS ="";
                      if(drv!=null)
                      {
        COLOURS = Convert.ToString(drv["S_FLAG_COLOUR"]);
                          switch (COLOURS)
       {
    case "0":
    {e.Item.ForeColor = Color.Black;
    e.Item.ForeColor = Color.Black;
    }
    break;
    case "1":
    {
    e.Item.ForeColor = Color.Red;
    e.Item.ForeColor = Color.Red;}
    break;
    case "2":
    {
    e.Item.ForeColor = Color.DeepPink;
    e.Item.ForeColor = Color.DeepPink;}
    break;
    }
                      }
             }
    }
      

  5.   

    什么呀,是你的写法有问题
    string COLOURS = (string)drv["S_FLAG_COLOUR"];哪能这么写?它的结合方式是先转换drv为string再求指定索引的数据当然会错了
    直接这种就行了嘛:string COLOURS = drv["S_FLAG_COLOUR"].ToString();
      

  6.   

    还有这个(DataRowView)e.Item.DataItem;
    改为(DataRowView)(e.Item.DataItem);
      

  7.   

    string COLOURS = (string)drv["S_FLAG_COLOUR"];
    如果S_FLAG_COLOUR是字符类型是没问题的,如果不是就会转换错误.
    string COLOURS = drv["S_FLAG_COLOUR"].ToString();
      

  8.   

    if(e.Item.ItemType==ListItemType.Item||e.Item.ItemType==ListItemType.AlternatingItem||e.Item.ItemType==ListItemType.EditItem)
    {
    .....
    }