Private Sub DataGrid2_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DataGridItemEventArgs) Handles DataGrid2.ItemDataBound        Dim lbl As Label = e.Item.FindControl("Label5")
        Dim duestr As String = lbl.Text.ToString '如果是取不含控件的列,如e.Item.Cells(2).Text(),则没有问题        e.Item.Cells(7).Attributes.Add("onclick", "alert('" & duestr & "'); return false;")
    End Sub
运行出错提示为:
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。源错误: 
行 252:        '    '    End If
行 253:        Dim lbl As Label = e.Item.FindControl("Label5")
行 254:        Dim duestr As String = lbl.Text.ToString
行 255:
行 256:        e.Item.Cells(7).Attributes.Add("onclick", "alert('" & duestr & "'); return false;")
 

解决方案 »

  1.   

    是不是ItemDataBound事件是发生在单元格控件之前,所以无法获取控件?高手想想办法啊。
      

  2.   

    可以实现的。
    假设你的Label在Cells(1),你可以这样写
    Dim duestr As String =((Label)e.Item.Cells(1).Controls(0)).Text
    Controls(0)代表第一个控件,但你要注意LiteralControl的存在,所以如果出错,你可以改变Controls的索引试试。
      

  3.   

    首先,你必须知道e.Item.Cells(2)包含的控件类型。如果没有控件,那就是 Lable 了,所以Dim lbl As Label = e.Item.FindControl("Label5")能返回正确的控件 lbl, 否则lbl必将是 null. 如果包含了其他控件,那就要用其他控件类型来做了。如: 
      dim txt as Textbox = e.Item.FindControl("text")
      

  4.   

    记不太清楚了,好像是得不到吧,如果可以得到的话,你还要加上itemtype的判断,因为发生这个方法的时候,不光要普通的item绑定,想headeritem,edititem,footeritem等都要有绑定动作
    要加上
    if(e.Item.ItemType==ListItemType.Item||e.Item.ItemType==ListItemType.AlternativeItem)
    {
    //your operation.
    }
      

  5.   

    单元格中是label控件。ID为label15。
     Dim lbl As Label = e.Item.FindControl("Label5")也没有错,
    就是加上这一句 Dim duestr As String = lbl.Text就出错
      

  6.   

    错误原因你没有经过判断,你把你的代码放到
    if(e.Item.ItemType==ListItemType.Item||e.Item.ItemType==ListItemType.AlternativeItem)
    {
    //your operation.
    }
    就可以了!
      

  7.   

    if(lb1!=null)
    {
    //
    使用lb1
    }
    else
    {
    ,没找到
    }