我想实现的是把超连接列的字数控制在10个字之内,
private void DataGrid1_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)

  for(int i=1;i<6;i++)
 {
  if(DataGrid1.Columns[i] is BoundColumn)
  {
e.Item.Cells[i].Text=e.Item.Cells[i].Text.ToString().Length>10?e.Item.Cells[i].Text.ToString().Substring(0,10)+"...":e.Item.Cells[i].Text.ToString().Trim();
  }
  else if(DataGrid1.Columns[i] is System.Web.UI.WebControls.HyperLinkColumn)
  {
System.Web.UI.WebControls.HyperLink link = (HyperLink)e.Item.Cells[i].Controls[0];  //
link.Text = link.Text.Length>10?link.Text.ToString().Trim().Substring(0,10)+"...":link.Text.ToString().Trim();  }
}
}然后提示 指定的参数已超出有效值的范围。参数名: index 
错误行:System.Web.UI.WebControls.HyperLink link = (HyperLink)e.Item.Cells[i].Controls[0];在原来我也是这样写的,也可以的,不知道是怎么回事??

解决方案 »

  1.   

    用这个System.Web.UI.WebControls.HyperLinkColumn
    肯定是不行的,应该用模板列嵌入HyperLink直接用HyperLinkColumn,其Controls[]数组是空的
      

  2.   

    把超链接列转成模板列再把这句
    System.Web.UI.WebControls.HyperLink link = (HyperLink)e.Item.Cells[i].Controls[0];改成HyperLink link = (HyperLink)e.Item.Cells[i].FindControl(你的模板列中HyperLink的名字)
      

  3.   

    不行啊,这样的话是没有错误了,可是我的长度明明超过了10,都不会显示....
    是不是DataGrid1.Columns[i] is System.Web.UI.WebControls.HyperLinkColumn这句要改成模板列,怎么改啊?
      

  4.   

    在HTML里面 绑定时 就用这个Substring(0,10)+"...": 不要吗?
      

  5.   

    不是在HTML里面绑定 的,在后台
      

  6.   

    (HyperLink)e.Item.Cells[i].Controls[0];改成:(HyperLink)e.Item.FindControl("控件名");行不?
      

  7.   

    (HyperLink)e.Item.FindControl("控件名");(用这个不就可以得到这个控件吗?)得到后 在写后面的不行吗?DataGrid1.Columns[i]这个 你为什么用  你有几个列是HyperLink?
      

  8.   

    用模板列
    <asp:TemplateColumn Visible="False" HeaderText="用户名">
    <ItemTemplate>
    <asp:HyperLink id=HyperLink1 runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.user_id") %>' NavigateUrl='<%# "~/part/look_user/look_user_info.aspx?id="+DataBinder.Eval(Container, "DataItem.user_id") %>'>
    </asp:HyperLink>
    </ItemTemplate>
    </asp:TemplateColumn>
      

  9.   

    你要是几个 HyperLink 
    你可以多设几模板列 在里面放HyperLink 分别取个ID
    在ItemDataBound方法中 直接这样取:
    (HyperLink)e.Item.FindControl("控件名");多好。
    你那样循环很容易有问题,不适合以后修改。
      

  10.   

    我是模板列啊<asp:TemplateColumn HeaderText="意见主题">
    <ItemTemplate>
    <asp:HyperLink id=HyperLink1 runat="server" Text='<%# DataBinder.Eval(Container, "DataItem.Object") %>' NavigateUrl='<%# DataBinder.Eval(Container, "DataItem.TableId", "DoComment.aspx?TId={0}") %>'>
    </asp:HyperLink>
    </ItemTemplate>
    </asp:TemplateColumn>
      

  11.   

    System.Web.UI.WebControls.HyperLink link = (HyperLink)e.Item.FindControl("")
    link.Text = link.Text.Length>10?link.Text.ToString().Trim().Substring(0,10)+"...":link.Text.ToString().Trim();不要循环呀。。
    e.Item.FindControl 这个就是定位到当前行的哪个控件的啊
      

  12.   

    可是还是有问题啊,
    System.Web.UI.WebControls.HyperLink link = (HyperLink)e.Item.Cells[i].Controls[0];  link.Text = link.Text.Length>10?link.Text.ToString().Trim().Substring(0,10)+"...":link.Text.ToString().Trim();
    就这两句有问题啊,是不是link 不存在啊
      

  13.   

    System.Web.UI.WebControls.HyperLink link
    改成 HyperLink link
      

  14.   

    我已经不写在循环里面了,可是还是没有将对象设置到实例啊System.Web.UI.WebControls.HyperLink link = (HyperLink)e.Item.Cells[2].FindControl("HyperLink1");
    link.Text = link.Text.Length>10?link.Text.ToString().Trim().Substring(0,10)+"...":link.Text.ToString().Trim();
      

  15.   

    (HyperLink)e.Item.Cells[2].FindControl("HyperLink1");
    晕  你加Cells[2]这 干嘛就这样啊
    (HyperLink)e.Item.FindControl("HyperLink1");
      

  16.   

    System.Web.UI.WebControls.HyperLink link = (HyperLink)e.Item.Cells[i].Controls[0];
    你调试看看你的Conrols[0]是不是HyperLink 
    也许Conrols[1]是HyperLink 。
    有时候看到Conrols[0]是个什么Literal...
      

  17.   

    (HyperLink)e.Item.FindControl("HyperLink1")也是同样的问题啊
      

  18.   

    用(HyperLink)e.Item.FindControl("hl1");
    不用定位,他可以自己定位到 hl1 这里。e.Item.FindControl("hl1");意思是说:定位当前这一行的hl1控件。
      

  19.   

    我的第三列里面只有一个控件啊
    哪来的Conrols[1]啊
      

  20.   

    把你的DataGrid 整个 发来看看
      

  21.   

    To:liwei81888() 用(HyperLink)e.Item.FindControl("hl1");
    也是同样的错误啊
      

  22.   

    把你的DataGrid 整个 发来看看
      

  23.   

    把你的DataGrid 整个 发来看看我是说HTML 你怎么写的
      

  24.   

    <%@ Page language="c#" Codebehind="BasicInfo.aspx.cs" AutoEventWireup="false" Inherits="DoitPm.InfoManage.BasicInfo" %>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
    <HTML>
      <HEAD>
    <title>BasicInfo</title>
    <meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
    <meta content="C#" name="CODE_LANGUAGE">
    <meta content="JavaScript" name="vs_defaultClientScript">
    <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
    <LINK href="../admin/UserPers/img/link.css" type="text/css" rel="stylesheet">
      </HEAD>
    <body MS_POSITIONING="GridLayout">
    <FONT face="宋体"></FONT>
    <form id="Form1" method="post" runat="server">
    <FONT face="宋体">
    <asp:label id="Label2" style="Z-INDEX: 101; LEFT: 8px; POSITION: absolute; TOP: 16px" runat="server"
    Font-Size="11pt" ForeColor="Purple" Font-Bold="True">BBS留言板</asp:label><asp:datagrid id="DataGrid1" style="Z-INDEX: 102; LEFT: 0px; POSITION: absolute; TOP: 40px" runat="server"
    Font-Size="10pt" ForeColor="DarkOliveGreen" Width="790px" AutoGenerateColumns="False" BorderColor="Goldenrod" BorderStyle="Solid" BorderWidth="2px" BackColor="White"
    CellPadding="4" AllowPaging="True" DataKeyField="Id" PageSize="18">
    <SelectedItemStyle Font-Bold="True" ForeColor="White" BackColor="#CC3333"></SelectedItemStyle>
    <HeaderStyle Font-Bold="True" ForeColor="White" BackColor="#333333"></HeaderStyle>
    <FooterStyle ForeColor="Black" BackColor="#CCCC99"></FooterStyle>
    <Columns>
    <asp:BoundColumn HeaderText="序号">
    <HeaderStyle Width="30px"></HeaderStyle>
    </asp:BoundColumn>
    <asp:BoundColumn DataField="ProjectName" HeaderText="关于预算"></asp:BoundColumn>
    <asp:TemplateColumn HeaderText="意见主题">
    <ItemTemplate>
    <asp:HyperLink id="HyperLink1" runat="server" NavigateUrl='<%# DataBinder.Eval(Container, "DataItem.TableId", "DoComment.aspx?TId={0}") %>' Text='<%# DataBinder.Eval(Container, "DataItem.Object") %>'>
    </asp:HyperLink>
    </ItemTemplate>
    </asp:TemplateColumn>
    <asp:BoundColumn DataField="UserName" HeaderText="发帖人"></asp:BoundColumn>
    <asp:BoundColumn DataField="DeptName" HeaderText="所在部门"></asp:BoundColumn>
    <asp:BoundColumn DataField="RoleName" HeaderText="职位"></asp:BoundColumn>
    <asp:BoundColumn DataField="Times" HeaderText="发表时间 " DataFormatString="{0:d}"></asp:BoundColumn>
    <asp:ButtonColumn Text="删除" CommandName="Delete"></asp:ButtonColumn>
    </Columns>
    <PagerStyle HorizontalAlign="Right" ForeColor="Black" BackColor="White"></PagerStyle>
    </asp:datagrid><asp:imagebutton id="ImageButton1" style="Z-INDEX: 103; LEFT: 656px; POSITION: absolute; TOP: 8px"
    runat="server" ImageUrl="../images/system/fbxt.jpg"></asp:imagebutton></FONT></form>
    </body>
    </HTML>
      

  25.   

    for(int i=1;i<6;i++)
     {
      if(DataGrid1.Columns[i] is BoundColumn)
      {
    e.Item.Cells[i].Text=e.Item.Cells[i].Text.ToString().Length>10?e.Item.Cells[i].Text.ToString().Substring(0,10)+"...":e.Item.Cells[i].Text.ToString().Trim();
      }
      else if(DataGrid1.Columns[i] is System.Web.UI.WebControls.HyperLinkColumn)
      {
    System.Web.UI.WebControls.HyperLink link = (HyperLink)e.Item.Cells[i].Controls[0];  //
    link.Text = link.Text.Length>10?link.Text.ToString().Trim().Substring(0,10)+"...":link.Text.ToString().Trim();  }
    -----------------------------------------------------------------------
    改成:
    HyperLink link = (HyperLink)e.Item.FindControl("HyperLink1");
    link.Text = link.Text.Length>10?link.Text.ToString().Trim().Substring(0,10)+"...":link.Text.ToString().Trim();
      

  26.   

    改成:
    HyperLink link = (HyperLink)e.Item.FindControl("HyperLink1");
    link.Text = link.Text.Length>10?link.Text.ToString().Trim().Substring(0,10)+"...":link.Text.ToString().Trim();
    这样以后还是一个错误
    未将对象引用设置到对象的实例。System.Web.UI.WebControls.HyperLinkSystem.Web.UI.WebControls.HyperLinkSystem.Web.UI.WebControls.HyperLinkSystem.Web.UI.WebControls.HyperLink未将对象引用设置到对象的实例。
      

  27.   

    未将对象引用设置到对象的实例
    说的是link 没实例
      

  28.   

    何必这么复杂:
    string sql="select id,left(title,17)+'...' as title from news order by id desc";
      

  29.   

    就是说怎么会link没有实例的,明明是有的啊
      

  30.   

    说的是link 没实例  转换出错或HyperLink1没这ID
      

  31.   

    <asp:TemplateColumn HeaderText="意见主题">
    <ItemTemplate>
    <asp:HyperLink id="HyperLink1" runat="server" NavigateUrl='<%# DataBinder.Eval(Container, "DataItem.TableId", "DoComment.aspx?TId={0}") %>' Text='<%# DataBinder.Eval(Container, "DataItem.Object") %>'>
    </asp:HyperLink>
    </ItemTemplate>
    </asp:TemplateColumn>改成:
    <asp:TemplateColumn HeaderText="意见主题">
    <ItemTemplate>
    <asp:HyperLink id="HyperLink1" runat="server" NavigateUrl='<%# DataBinder.Eval(Container, "DataItem.TableId", "DoComment.aspx?TId={0}") %>' >
    <%# DataBinder.Eval(Container, "DataItem.Object") %> </asp:HyperLink>
    </ItemTemplate>
    </asp:TemplateColumn>
      

  32.   

    把 text 的内容  写在 <asp:HyperLink>text写在中间</asp:HyperLink>
      

  33.   

    不行啊,说
    异常详细信息: System.ArgumentOutOfRangeException: 指定的参数已超出有效值的范围。参数名: index错误行:System.Web.UI.WebControls.HyperLink link = (System.Web.UI.WebControls.HyperLink)e.Item.Cells[i].Controls[0];
      

  34.   

    错误行:System.Web.UI.WebControls.HyperLink link = (System.Web.UI.WebControls.HyperLink)e.Item.Cells[i].Controls[0];你可以调试看看你的Controls[0]是不是HyperLink 
    我敢保证不是错误很明确嘛