【问题标题】:fitting long text in GridView Column在 GridView 列中拟合长文本
【发布时间】:2013-07-14 20:38:15
【问题描述】:

我在 ASP.NET gridview 列中显示长文本时遇到问题。我不希望文本换行到第二行,因为这是不换行的业务要求之一。

理想情况下,我想要某种基于服务器或客户端的代码,它可以帮助我将文本截断为列的大小,然后可能显示更多按钮或“...”以获得更多文本?

当点击更多按钮或...时;将出现一个弹出窗口,其中包含其余文本或全文。

注意:文本或字符串的大小会有所不同,长度可以是 25 到 75 个字符。

关于我应该如何实现上述目标的任何想法?谢谢

【问题讨论】:

  • 您可以做的是向列添加一个 maxWidth,并添加一个工具提示服务,当您越过单元格时显示所有文本。
  • 工具提示服务?你能解释一下吗?谢谢
  • ASP 元素的ToolTip 属性转换为HTML 节点的title 属性。这是当您将鼠标悬停在节点上时出现的文本提示。

标签: c# javascript asp.net gridview


【解决方案1】:

如果您担心格式,我会构建我的查询(您将 GridView 绑定到的查询),以便以两种形式返回数据。

Select Left(dataColumn, 20) as TruncatedData, dataColumn as FullData From table

然后,您可以将 GridView 绑定到 TruncatedData 列,并将工具提示绑定到 FullData 列,这样当它们悬停时,它们会获得完整的列数据。我会将BoundField 转换为TemplateField 并这样填充:

          <asp:templatefield>
              <itemtemplate>
                  <asp:label id="lblData"
                      Text= '<%# Eval("TruncatedData") %>'
                      runat="server"
                      ToolTip='<%# Eval("FullData") %>' /> 
              </itemtemplate>
          </asp:templatefield>

【讨论】:

【解决方案2】:

您应该发布您尝试过的代码,以便人们可以提出更改/改进等。无论如何,我必须编写一个代码来按照您正在寻找的内容做一些事情,所以在这里您有它。

private string[] truncateText(string iniText, int colNumber, int noAddRows)
{
    string[] outStrings = new string[noAddRows + 3];
    if (noAddRows == 0)
    {
        outStrings = new string[22];
    }
    outStrings[1] = iniText;
    int addBit = 10;
    int maxLength = (int)GridView1.Columns[colNumber].ItemStyle.Width.Value + addBit;
    int linesCount = 1;

    if (iniText.Length > maxLength)
    {
        outStrings[1] = iniText.Substring(0, maxLength); //New truncated string
        outStrings[2] = iniText.Substring(maxLength, iniText.Length - maxLength); //Remaining bit
        linesCount = 2;
        if (noAddRows > -1 && outStrings[2].Length > maxLength)
        {
            //Further lines of the truncated bit
            string remBit = outStrings[2].Substring(maxLength, outStrings[2].Length - maxLength);
            outStrings[2] = outStrings[2].Substring(0, maxLength);
            while (remBit.Length > 0)
            {
                linesCount = linesCount + 1;
                if ((noAddRows > 0 && linesCount > noAddRows + 2) || linesCount > 20)
                {
                    linesCount = linesCount - 1;
                    if (remBit.Length > 0)
                    {
                        outStrings[linesCount] = outStrings[linesCount] + remBit;
                    }
                    break;
                }

                if (remBit.Length <= maxLength)
                {
                    outStrings[linesCount] = remBit;
                    break;
                }
                else
                {
                    outStrings[linesCount] = remBit.Substring(0, maxLength);
                    remBit = remBit.Substring(maxLength, remBit.Length - maxLength);
                }
            }
        }
    }

    outStrings[0] = Convert.ToString(linesCount); //Total number of lines

    return outStrings;
}

你可以这样称呼它:

string[] truncatedLines = truncateText("text to truncate", colNo, noAdd);

输出string[] 保存所有被截断的行,使它们适合给定列的宽度 + 一个小位(addBit,我设置为 10)。使用noAddRows 参数,您可以控制要作为输出的行数:如果将其设置为零,则根据给定的列宽,它会返回所需的行数。数组的 0 位置是为返回的总行数保留的。

我猜你不会发现使用这段代码完全控制你想要实现的功能有什么问题。

【讨论】:

    【解决方案3】:

    为 gridview 列使用这个 CSS 类

    .ellipsis {
        white-space: nowrap;
        text-overflow: ellipsis;
        width: 50px;
        display: block;
        overflow: hidden;
    }
    

    它将 ... 以特定宽度放在列的末尾。

    更新

    标记

    <asp:GridView ID="GridView1" runat="server" DataSourceID="SqlDataSource1"
            AutoGenerateColumns="False" CssClass="employees-grid">
            <Columns>
                <asp:BoundField DataField="id" HeaderText="ID">
                    <ItemStyle CssClass="employees-grid-id" />
                </asp:BoundField>
                <asp:BoundField DataField="first_name" HeaderText="First Name">
                    <ItemStyle CssClass="employees-grid-first-name" />
                </asp:BoundField>
                <asp:BoundField DataField="last_name" HeaderText="Last Name">
                    <ItemStyle CssClass="employees-grid-last-name" />
                </asp:BoundField>
                <asp:BoundField DataField="email" HeaderText="Email">
                    <ItemStyle CssClass="employees-grid-email" />
                </asp:BoundField>
                <asp:BoundField DataField="note" HeaderText="Note">
                    <ItemStyle CssClass="employees-grid-note" />
                </asp:BoundField>
            </Columns>
    </asp:GridView>
    

    CSS

    .employees-grid {
        table-layout: fixed;
        width: 100%;
    }
    .employees-grid-id {
        width: 5%;   
    }
    .employees-grid-first-name {
        width: 10%; 
    }
    .employees-grid-last-name {
        width: 10%;   
    }
    .employees-grid-email {
        width: 15%; 
    }
    .employees-grid-note {
        width: 100%;
        white-space: nowrap;
        text-overflow: ellipsis;
        display: block;
        overflow: hidden;
    }
    

    【讨论】:

    • 我正在从 SP 列表中获取数据,stackoverflow.com/questions/25979966/…。我怎样才能实现你的想法?
    • @SearchForKnowledge 只需设置列的“CssClasss”即可。
    • @AbbasAmiri:这是一个简单的解决方案!我可以建议将您关于将 css 类添加到列的评论添加到主要答案中。另外,我们可以用百分比引用宽度吗?尝试了很多建议,但无法正常工作。
    • @MilindThakkar,感谢您的评论。我已经更新了我的答案。
    猜你喜欢
    • 2017-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 1970-01-01
    • 1970-01-01
    • 2012-04-08
    相关资源
    最近更新 更多