限制GridView列中的文本大小

时间:2011-10-04 16:04:32

标签: c# asp.net gridview

我的 asp:GridView 声明如下:

<asp:GridView runat="server" id="dg_myprojects" AllowSorting="true" AutoGenerateColumns="false" Width="900px" CssClass="Grid" OnSorting="TaskGridView_SortingMine" OnRowCommand="MyProjectList_RowCommand" DataKeyNames="project_id" OnRowDataBound="Ds_my_projects_RowDataBound">
    <AlternatingRowStyle CssClass="alternateRow" />
    <HeaderStyle CssClass="GridHeader" />
    <Columns>
        <asp:BoundField DataField="project_name" HeaderText="Project Name" SortExpression="project_name"/>
        <asp:BoundField DataField="description" HeaderText="Description" SortExpression="description" ItemStyle-HorizontalAlign="Left" />
        <asp:BoundField DataField="role" HeaderText="Role" SortExpression="role" />
        <asp:BoundField DataField="start_date" HeaderText="Start Date" SortExpression="start_date" DataFormatString="{0:d}"/>
        <asp:BoundField DataField="end_date" HeaderText="End Date" SortExpression="end_date" DataFormatString="{0:d}" />
        <asp:BoundField DataField="client" HeaderText="Client" SortExpression="client" />
        <asp:TemplateField>
        <ItemTemplate>
             <asp:LinkButton ID="DeleteButton" CommandArgument='<%# Eval("project_id") %>' CommandName="Remove" runat="server">Remove</asp:LinkButton>
        </ItemTemplate></asp:TemplateField>
        <asp:HyperLinkField DataNavigateUrlFields="project_id" DataNavigateUrlFormatString="EditProject.aspx?pID={0}" Text="Edit"/>
    </Columns>
</asp:GridView>

我的问题是100%美学。为长描述而发生的自动换行使表格看起来很俗气。我想用长描述做的是当描述太长时有一个省略号(...)

  

长描述等等......

我找不到内置的方法,所以我决定尝试实现GridView的这个OnRowDataBound

protected void Ds_my_projects_RowDataBound(object sender, GridViewRowEventArgs e)
{            
   DataRow curRow = ((DataRowView)e.Row.DataItem).Row;
  if (curRow["Description"].ToString().Length > 200)
       curRow["Description"] = curRow["Description"].ToString().Substring(0, 200) + "...";

}

我在第一行遇到运行时异常,因为对象引用未设置为对象的实例

我在这里做错了什么?有没有更简单的方法来完成我想要做的事情?

6 个答案:

答案 0 :(得分:16)

您可以使用css处理它并将其添加到Grid css类:

.Grid {
    table-layout:fixed; 
    width:100%; 
}
.Grid .Shorter {
    overflow: hidden; 
    text-overflow: ellipsis; 
    white-space: nowrap;        
}

更新:我修改了上面的类,以便您可以使用ItemStyle-CssClass属性影响单个列,如下所示:

<asp:BoundField DataField="description" HeaderText="Description" 
    SortExpression="description" ItemStyle-CssClass="Shorter" />

答案 1 :(得分:7)

我要做的是创建一个可以缩短字符串的Extension类。静态类将具有类似以下方法:

public static string Shorten(this string name, int chars)
{
    if (name.ToCharArray().Count() > chars)
    {
        return name.Substring(0, chars) + "...";
    }
    else return name;
}

然后您可以将BoundFields用作TemplateFields,如下所示:

<asp:TemplateField> 
    <ItemTemplate>
        <asp:Label ID="lblDesc" Text="<%# Eval("description").ToString().Shorten(20) %>" />
    </ItemTemplate>
</asp:TemplateField>

关于这一点的好处是你现在可以在任何地方使用Shorten()方法。

答案 2 :(得分:2)

CAbbot有一个很好的建议。我从来没有这样做,但如果这对你有用,那么我喜欢那样;简单,优雅,高效。

我一直在做的方式是通过DataSource。如果您将SqlDataSource绑定到GridView,则可以执行以下选择查询:

DECLARE @temp NVARCHAR(255);
DECLARE @maxLength INT;
SET @temp = 'The quick brown fox jumped over the lazy dog.';
SET @maxLength = 10;

SELECT CASE WHEN LEN(@temp) > @maxLength THEN SUBSTRING(@temp, 0, @maxLength) + '...' ELSE @temp END

至于解决您RowDataBound手头的问题,这也应该有用。但你不应该进行投射,而是试试这个:

protected void Ds_my_projects_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        if (e.Row.Cells[1].Text.ToString().Length > 200)
        {
            e.Row.Cells[1].Text = e.Row.Cells[1].Text.ToString().Substring(0, 200) + "...";
        }
    }
}

答案 3 :(得分:1)

 <asp:TemplateField HeaderText="Description" SortExpression="description" >
    <ItemTemplate >
      <%# Eval("description").ToString().Length>100? (Eval("description") as string).Substring(0,100)+"..." : Eval("description")  %> 
    </ItemTemplate>
 </asp:TemplateField> 

答案 4 :(得分:1)

模板字段中的GridView列备注显示为“备注...”,工具提示将显示为全文。

 <ItemTemplate>    <asp:Label ID="lblRemark" runat="server" 
                   Text= '<%# Eval("Remark").ToString().Length > 6? (Eval("Remark") as string).Substring(0,6) + " ..." : Eval("Remark")  %>'
                   tooltip = '<%# Eval("Remark") %> '> </asp:Label>
 </ItemTemplate>

答案 5 :(得分:0)

我尝试了这段代码并且运行正常。 将以下代码添加到.aspx页面:

exp_month.toString().padStart(2, '0')