我在datagrid的ItemDataBound事件中,想处理当字数太长的时候截断,并给这一行的ToolTip附上该字段的值,代码如下:
private void dg_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
if ( ( e.Item.ItemType != ListItemType.Header ) && ( e.Item.ItemType != ListItemType.Footer ))
{
HyperLink lj= ( HyperLink ) e.Item.Cells[1].Controls[0];
if(lj != null)
{
if(this.ShowNum>0)
{
e.Item.Cells[1].ToolTip=lj.Text;
if(lj.Text.Length>this.ShowNum)
{    
e.Item.Cells[1].Text="<a href=" + lj.NavigateUrl + "&table=" + table + ">" + lj.Text.Substring(0,ShowNum) + "..." + "</a>";
}
else
{
e.Item.Cells[1].Text="<a href=" + lj.NavigateUrl + "&table=" + table + ">" + lj.Text + "</a>";
}
}
else
{
e.Item.Cells[1].Text="<a href=" + lj.NavigateUrl + "&table=" + table + ">" + lj.Text + "</a>";
}
}
if(e.Item.ItemIndex!=-1)
{
HyperLink hk=(HyperLink)e.Item.FindControl("HyperLink1");
if(hk != null)
   hk.NavigateUrl="input.aspx?id=" + this.dg.DataKeys[e.Item.ItemIndex].ToString();
}
}
}但是,显示出来的时候,在分页里,第一页没问题,但是只要点击其它页就出现如下错误:指定的参数已超出有效值的范围。参数名: index 
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.ArgumentOutOfRangeException: 指定的参数已超出有效值的范围。参数名: index源错误: 行 95:  if ( ( e.Item.ItemType != ListItemType.Header ) && ( e.Item.ItemType != ListItemType.Footer ))
行 96:  {
行 97:  HyperLink lj= ( HyperLink ) e.Item.Cells[1].Controls[0];
行 98:  if(lj != null)
行 99:  {
 
这个错误,百思不得其解,请大虾指教!

解决方案 »

  1.   

    1.前台
      <asp:TemplateColumn>
    <ItemStyle HorizontalAlign="Left" Wrap="true"></ItemStyle>
    <ItemTemplate>
    <asp:Label runat="server" Text='<%# GetDemand(DataBinder.Eval(Container, "DataItem.demand").ToString())%>'>
    </asp:Label>
    </ItemTemplate>
     </asp:TemplateColumn>
    2.后台
    protected string GetDemand(string strDemand)
    {
    string subDemand = strDemand;

    //取前10个字串(如果需求长度小于十个,则取原串) if(subDemand.Length > 10)     
    {
    subDemand = subDemand.Substring(0,10) + "...";
    }
    string titleDemand = strDemand.Replace("<br>","\r\n").Replace("&nbsp;"," ");
    string HtmlTitle = "<A title=\"" + titleDemand + "\" >" + subDemand + "</A>"; return HtmlTitle;  
    }
      

  2.   

    if ( ( e.Item.ItemType != ListItemType.Header ) && ( e.Item.ItemType != ListItemType.Footer ) && e.Item.ItemType !=ListItemType.Pager )
    多加一个条件试试
      

  3.   

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

  4.   

    if((e.Item.ItemType == ListItemType.AlternatingItem) || (e.Item.ItemType == ListItemType.Item))
    {
    }
    这样应该没问题的
      

  5.   

    谢谢三位的回复,但是
    ChengKing(bantamweight)介绍的方法,可能不大合适我用,我这里有太多的DataGrid,如果这样做的话,效率太低!
     ghchen()和mathsword(梦在流浪)的方法试过了,还是出错!
      

  6.   

    ShowNum是不是一个全局变量呢?如果显示下一页,它的值会被重新定义的。
      

  7.   

    ShowNum这个变量没有问题,我单步执行的时候检查过了!
      

  8.   

    e.Item.ItemIndex!=-1的情况有两种:
    1、第一行
    2、最后一行按照你的写法,最后一行没有数据;
      

  9.   

    为什么要e.Item.ItemIndex!=-1呢?
    第一行和最后一行的时候,e.Item.ItemIndex也为-1
      

  10.   

    谢谢 swordragon(古道热肠),其实是这样的,那一段是另外一个判断,和我出错的地方没什么关联的
    if(e.Item.ItemIndex!=-1)
    {
    HyperLink hk=(HyperLink)e.Item.FindControl("HyperLink1");
    if(hk != null)
       hk.NavigateUrl="input.aspx?id=" + this.dg.DataKeys[e.Item.ItemIndex].ToString();
    }
      

  11.   

    楼主还没有解决啊,试试
    if ( ( e.Item.ItemType != ListItemType.Header ) && ( e.Item.ItemType != ListItemType.Footer )&& (e.Item.Cells[1].Controls.Count >0))
    应该没有问题了
      

  12.   

    谢谢ghchen() 兄,果然解决问题了,呵呵 :)
    并对帮助过我的兄弟姐妹表示感谢!