我想实现的是把超连接列的字数控制在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];在原来我也是这样写的,也可以的,不知道是怎么回事??
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];在原来我也是这样写的,也可以的,不知道是怎么回事??
肯定是不行的,应该用模板列嵌入HyperLink直接用HyperLinkColumn,其Controls[]数组是空的
System.Web.UI.WebControls.HyperLink link = (HyperLink)e.Item.Cells[i].Controls[0];改成HyperLink link = (HyperLink)e.Item.Cells[i].FindControl(你的模板列中HyperLink的名字)
是不是DataGrid1.Columns[i] is System.Web.UI.WebControls.HyperLinkColumn这句要改成模板列,怎么改啊?
<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>
你可以多设几模板列 在里面放HyperLink 分别取个ID
在ItemDataBound方法中 直接这样取:
(HyperLink)e.Item.FindControl("控件名");多好。
你那样循环很容易有问题,不适合以后修改。
<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>
link.Text = link.Text.Length>10?link.Text.ToString().Trim().Substring(0,10)+"...":link.Text.ToString().Trim();不要循环呀。。
e.Item.FindControl 这个就是定位到当前行的哪个控件的啊
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 不存在啊
改成 HyperLink link
link.Text = link.Text.Length>10?link.Text.ToString().Trim().Substring(0,10)+"...":link.Text.ToString().Trim();
晕 你加Cells[2]这 干嘛就这样啊
(HyperLink)e.Item.FindControl("HyperLink1");
你调试看看你的Conrols[0]是不是HyperLink
也许Conrols[1]是HyperLink 。
有时候看到Conrols[0]是个什么Literal...
不用定位,他可以自己定位到 hl1 这里。e.Item.FindControl("hl1");意思是说:定位当前这一行的hl1控件。
哪来的Conrols[1]啊
也是同样的错误啊
<!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>
{
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();
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未将对象引用设置到对象的实例。
说的是link 没实例
string sql="select id,left(title,17)+'...' as title from news order by id desc";
<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>
异常详细信息: System.ArgumentOutOfRangeException: 指定的参数已超出有效值的范围。参数名: index错误行:System.Web.UI.WebControls.HyperLink link = (System.Web.UI.WebControls.HyperLink)e.Item.Cells[i].Controls[0];
我敢保证不是错误很明确嘛