我在
Windows窗体中有一个标签控件.我想在标签中显示全文.条件是这样的:
>如果文本长度超过了新行中的32个字符.
>如果可能的话,用完整的单词分割,不带连字符( – ).
到目前为止,我已达到以下代码:
private void Form1_Load(object sender,EventArgs e) { string strtext = "This is a very long text. this will come in one line.This is a very long text. this will come in one line."; if (strtext.Length > 32) { IEnumerable<string> strEnum = Split(strtext,32); label1.Text =string.Join("-\n",strEnum); } } static IEnumerable<string> Split(string str,int chunkSize) { return Enumerable.Range(0,str.Length / chunkSize) .Select(i => str.Substring(i * chunkSize,chunkSize)); }
但问题是最后一行没有完全显示,因为它分裂了32个字符.
还有另一种方法来实现这一目标吗?
解决方法
我不知道你是否会接受不使用linq的答案,但这很简单:
string SplitOnWholeWord(string toSplit,int maxLineLength) { StringBuilder sb = new StringBuilder(); string[] parts = toSplit.Split(); string line = string.Empty; foreach(string s in parts) { if(s.Length > 32) { string p = s; while(p.Length > 32) { int addedChars = 32 - line.Length; line = string.Join(" ",line,p.Substring(0,addedChars)); sb.AppendLine(line); p = p.Substring(addedChars); line = string.Empty; } line = p; } else { if(line.Length + s.Length > maxLineLength) { sb.AppendLine(line); line = string.Empty; } line = (line.Length > 0 ? string.Join(" ",s) : s); } } sb.Append(line.Trim()); return sb.ToString(); }
打电话给
string result = SplitOnWholeWord(strtext,32);
可以轻松地在扩展方法中对其进行转换:
public static class StringExtensions { public static string SplitOnWholeWord(this string toSplit,int maxLineLength) { // same code as above..... } }
并以这种方式调用它:
string result = strtext.SplitOnWholeWord(32);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。