如何使用C#与Asp.net?

时间:2017-12-01 09:27:23

标签: c# asp.net listbox

我想在列表框中创建换行符,以便文本不会一直拖动到用户无法读取文本的整个内容。

这是我当前输出的样子: enter image description here

我想要这样的话,当文本到达列表框的末尾时,它会下到下一行,简单来说就是自动换行。我已经上网搜索并发现使用listbox实现自动换行功能是不可能的。我设法在网上找到了一个Word Wrap算法,并决定使用它,但是我不确定如何将它实现到我希望它进入的列表框中。

以下是我找到的代码:

// https://www.codeproject.com/Articles/51488/Implementing-Word-Wrap-in-C

public static string WordWrap(string text, int width)
{
    int pos, next;
    StringBuilder sb = new StringBuilder();

    // Lucidity check
    if (width < 1)
        return text;

    // Parse each line of text
    for (pos = 0; pos < text.Length; pos = next)
    {
        // Find end of line
        int eol = text.IndexOf(Environment.NewLine, pos);
        if (eol == -1)
            next = eol = text.Length;
        else
            next = eol + Environment.NewLine.Length;

        // Copy this line of text, breaking into smaller lines as needed
        if (eol > pos)
        {
            do
            {
                int len = eol - pos;
                if (len > width)
                    len = BreakLine(text, pos, width);
                sb.Append(text, pos, len);
                sb.Append(Environment.NewLine);

                // Trim whitespace following break
                pos += len;
                while (pos < eol && Char.IsWhiteSpace(text[pos]))
                    pos++;
            } while (eol > pos);
        }
        else sb.Append(Environment.NewLine); // Empty line
    }
    return sb.ToString();
}

/// <summary>
/// Locates position to break the given line so as to avoid
/// breaking words.
/// </summary>
/// <param name="text">String that contains line of text</param>
/// <param name="pos">Index where line of text starts</param>
/// <param name="max">Maximum line length</param>
/// <returns>The modified line length</returns>
private static int BreakLine(string text, int pos, int max)
{
    // Find last whitespace in line
    int i = max;
    while (i >= 0 && !Char.IsWhiteSpace(text[pos + i]))
        i--;

    // If no whitespace found, break at maximum length
    if (i < 0)
        return max;

    // Find start of whitespace
    while (i >= 0 && Char.IsWhiteSpace(text[pos + i]))
        i--;

    // Return length of text before whitespace
    return i + 1;
}

目前我把它作为一个方法,我应该把这个方法直接放在listbox方法本身吗? enter image description here

如果是,我如何修改上述代码才能使其正常工作? 顺便说一句,descLb是我的列表框的名称

请不要建议我将我的列表框更改为另一种形式(例如文本框),我只知道如何从数据库中提取文本以输入到列表框中并为我保持简单,我想使用列表框。

1 个答案:

答案 0 :(得分:0)

您不需要所有复杂的服务器端C#代码来将文本包装在asp.net的列表框中。您只需要一些特殊的CSS。例如,下面的CSS将自动将文本换行到asp.net列表框中。

如果您在CSS下面提到的宽度不足以适合列表框选项的文本,则会自动进行换行。

用于在文件框中包装文字的CSS

select option {
 white-space: normal;
 width: 100px

}

这是aspx标记,你可以尝试在你的结尾看到文本自动被包装。

请注意,

  • 我正在使用带有id的CSS选择器来专注于包装的特定列表框
  • 并且我还没有指定宽度,因为任何不能 容纳在列表框获取的100px的标记宽度内 自动变形

<%@ Page Language="C#" AutoEventWireup="true" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Wrtap text in ListBox</title>
    <style>
        select[id*='ListBox1'] option {
            white-space:normal;
        }
    </style>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:ListBox ID="ListBox1"
                Rows="6"
                Width="150px"
                SelectionMode="Single"
                runat="server">
                <asp:ListItem>Item 1 dsdds  sdsdsdsd sdsd sdsd sds xyz</asp:ListItem>
                <asp:ListItem>Item 2</asp:ListItem>
                <asp:ListItem>Item 3 gfgf kgkgkg kgkkg abc</asp:ListItem>
                <asp:ListItem>Item 4</asp:ListItem>
                <asp:ListItem>Item 5</asp:ListItem>
                <asp:ListItem>Item 6</asp:ListItem>
            </asp:ListBox>
        </div>
    </form>
</body>
</html>

Bellow是通过给出上面提到的特殊CSS样式,在asp.net列表框中看起来如何。

asp.net ListBox中文本换行的屏幕截图

Text wrapping in asp.net Listbox