Ограничить размер текста в столбце GridView - PullRequest
5 голосов
/ 04 октября 2011

У меня 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% эстетическая. Перенос слов для длинных описаний заставляет таблицу выглядеть липкой. Что я хочу сделать с длинным описанием, так это иметь эллипсы (...), когда описание становится слишком длинным

Длинное описание бла-бла ...

Мне не удалось найти встроенный метод для этого, поэтому я решил попробовать реализовать этот OnRowDataBound GridView.

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 ]

16 голосов
/ 04 октября 2011

Вы можете справиться с этим с помощью 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" />
7 голосов
/ 04 октября 2011

Что я хотел бы сделать, это создать класс 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 голосов
/ 04 октября 2011

У CAbbot есть отличное предложение. Я никогда не делал это таким образом, но если это работает для вас, тогда мне это нравится; простой, элегантный, эффективный.

То, как я всегда это делал, проходило через источник данных. Если вы привязываете 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) + "...";
        }
    }
}
1 голос
/ 18 марта 2014

Примечание столбца 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>
1 голос
/ 19 сентября 2013
 <asp:TemplateField HeaderText="Description" SortExpression="description" >
    <ItemTemplate >
      <%# Eval("description").ToString().Length>100? (Eval("description") as string).Substring(0,100)+"..." : Eval("description")  %> 
    </ItemTemplate>
 </asp:TemplateField> 
0 голосов
/ 09 ноября 2017

Я попробовал этот код, и он работал нормально.Добавьте следующий код на свою страницу .aspx:

        <asp:TemplateField HeaderText="Body" ItemStyle-Width="900px">
            <ItemTemplate >
                <%#Eval("Body").ToString().Length > 125 ? (Eval("Body").ToString().Substring(0,125))+"........": Eval("Body") %>
            </ItemTemplate>
        </asp:TemplateField>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...