最近有个需求,需要将C# winform中的listBox中的内容自动换行,

其实在用listBox前,已经用textBox实现了大部分功能,可惜最后还是有个焦点的问题,

就是textBox中的文字会自动被选中,也就是蓝背景,超难看,老板就说不行,所以改换ListBox来试一试

如大家所知,listBox的每一个item就是一条记录,而且默认是不会自动换行的,所以listBox才同时有垂直和水平的滚动条

百度和google一下后,网上给的思路大概是:限定一个长度,字符串超过长度的部分截取下来,添加到下一个item,这样就人为的实现了listBox的自动换行。

结合到我的需求中 字符串是包含空格的,所以我就想了两种思路

思路一:

1.把字符串分割成一个个单独的单词,然后像串珍珠链子一样,一个个的单词组装起来

2.如果长度没有超过给定长度则继续组装(这里用到join方法),

2.1.当超过给定长度时,把最后一个单词从列表中删掉,(并用中间变量保存下来,添加到下一行的开头,中间变量的初始值为空)

详细看代码:

 /*
*字符串换行,考虑到空格,以及完整单词的情况
*@param inputStr 要换行的字符串
*@param textWidth 固定的长度,超过这个长度则进行换行
*
*/
public List<string> listBoxWordWrap(string inputStr, int textWidth)
{
List<string> tempList = new List<string>();//临时存放拼接字符串的列表
List<string> lastList = new List<string>();//最终的数据
int strLength = inputStr.Length;//获取要换行字符串的长度
if (strLength > textWidth)
{
string[] listArray = inputStr.Split(' ');//先把字符串分割成一个个单词,后面再重新连接
string joinStr = "";
string theDeleteStr = "";//用来存放因为增加了它才超过固定长度的那个单词。
for (int j = ; j < listArray.Length; j++)
{
tempList.Add(listArray[j]);//把分割好的单词 一个个的往list里面添加
joinStr = String.Join(" ",tempList.ToArray());//然后转化成字符串
//每添加一个都跟固定长度比较一下,当小的时候,继续添加;如果大于的时候进入判断
if (joinStr.Length > textWidth)
{
//因为大于了固定长度,所以把最后一个单词删掉,删掉后的字符串为一条完整的记录,
int lastSpaceIndex = joinStr.LastIndexOf(" ");
lastList.Add((theDeleteStr+" "+joinStr.Substring(, lastSpaceIndex)).Trim());
theDeleteStr = listArray[j];
//刚好是最后一个的时候
if (j == listArray.Length - )
lastList.Add(theDeleteStr); tempList.Clear();//清空临时list
}
else if (j == listArray.Length - )//当遍历到结尾,剩下的当做最后一行
{
lastList.Add((theDeleteStr+" "+joinStr).Trim());
tempList.Clear();
}
}
}
return lastList;
}

思路二:

1.把字符串分割成一个个单独的单词,然后像串珍珠链子一样,一个个的单词组装起来

2.如果当前长度小于给定长度,但再多一个单词后,字符串的长度就大于给定长度,这样就能够确定换行处

详细看代码:

 /*
*字符串换行,考虑到空格,以及完整单词的情况
*@param inputStr 要换行的字符串
*@param textWidth 固定的长度,超过这个长度则进行换行
*
*/
public List<string> listBoxWordWrap2(string inputStr, int textWidth)
{
List<string> list = new List<string>();
List<string> lastList = new List<string>();
string str = inputStr;
int textWidth = ;
if (str != "" || str != null)
{
int strLength = str.Length;
if (strLength > textWidth)
{
string[] listArray = str.Split(' ');//先把字符串分割成一个个单词,后面再重新连接
string joinStr = "";//连接起来的字符串
string nextStr = "";//再添加多一个元素的连接字符串
for (int j = ; j < listArray.Length; j++)
{
list.Add(listArray[j]);
joinStr = String.Join(" ", list.ToArray());
//通过 当前字符串比固定长度小,但下一个字符串比固定长度大来判断换行处
if(joinStr.Length < textWidth && j < listArray.Length-){
list.Add(listArray[j+]);
nextStr = String.Join(" ",list.ToArray());
if (nextStr.Length > textWidth)
{
lastList.Add(joinStr);
list.Clear();
}
else
list.Remove(listArray[j+]);
}
else if (j == listArray.Length - )
{
lastList.Add(joinStr.Trim());
list.Clear();
}
} }
}
return lastList;
}

自动换行的两种代码(C#)的更多相关文章

  1. jquery添加select option两种代码思路比较

    功能需求:在客户选择了check_in_date和check_out_date之后,将在check_in_date至check_out_date的promotions中自动添加符合条件的promoti ...

  2. 小记:iOS 中一般对于 view 不依赖 model 的的两种代码书写形式

    一. 前言 对于在 MVC 的定义中,view 层是不引用 model 层,view 和 model 是不相往来的 一般开发中,我们都写过 在自定义 view 中增加一个 model 的属性,外接直接 ...

  3. webpack 安装vue(两种代码模式compiler 和runtime)

    使用webpack安装vue,import之后,运营项目报错,如下: [Vue warn]: You are using the runtime-only build of Vue where the ...

  4. java 22 - 10 多线程之两种代码实现方式的比较与区别

  5. 说一说Web开发中两种常用的分层架构及其对应的代码模型

    昨天妹子让我帮她解决个问题,本以为可以轻松搞定,但是打开他们项目的一瞬间,我头皮发麻.本身功能不多的一个小项目,解决方案里竟然有几十个类库.仅仅搞明白各个类库的作用,代码层次之间的引用关系就花了一个多 ...

  6. jsp中两种include的区别【转】

    引用文章:http://www.ibm.com/developerworks/cn/java/j-jsp04293/ http://www.cnblogs.com/lazycoding/archive ...

  7. 多重背包问题的两种O(M*N)解法

    多重背包的题目很多,最著名的是poj1742楼教主的男人八题之一. poj1742:coins 有几种面值的钱币和每种的数量,问能够组成m以内的多少种钱数 这个题大家都归为多重背包问题,不过跟实际意义 ...

  8. 基于VC++ Win32+CUDA+OpenGL组合与VC++ MFC SDI+CUDA+OpenGL组合两种方案的遥感影像显示:获得的重要结论!

    1.基于VC++ Win32+CUDA+OpenGL组合的遥感影像显示 在该组合方案下,初始化时将OpenGL设置为下面两种方式,效果一样 //设置方式1 glutInitDisplayMode (G ...

  9. 【代码笔记】iOS-向服务器传JSON数据的两种方式

    一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. ...

随机推荐

  1. openfire消息发送

    找了一些demo,做了一些示例,演示了基于xmpp协议的openfire的客户端之间消息的发送. 代码需要两个包,smack.jar ,smackx.jar. 第一个代码,只是点对点发送消息的,不涉及 ...

  2. K8S+GitLab-自动化分布式部署ASP.NET Core(一) 部署环境

    一.部署流程介绍 开发人员通过Git上传asp.net core 项目到Gilab,并编写好.gitlab-ci.yml , GitLab-Runner 自动拉取代码,然后进行Build,编译,单元测 ...

  3. 发起一个NetCore技术联盟促进NetCore技术应用

    一.简介 1.从十几年前开始net,到两年前转java,到去年底发现netcore2这玩艺,从此以后坚定成为netcore的追随着. 2.有心促进netcore的应用,聚集一些人员共同学习,减少技术使 ...

  4. SSE sqrt还是比C math库的sqrtf快了不少

    #include <stdio.h> #include <xmmintrin.h> #define NOMINMAX #include <windows.h> #i ...

  5. CSS2.1SPEC:视觉格式化模型之包含块

    原汁原味的才是最有味道的,在阅读CSS标准时对这一点的体会更加深刻了,阅读文档后的一大感觉就是很多看上去理所应当的样式表现也都有了对应的支持机制.本文首先从包含块写起,一方面总结标准中相应的阐述,并且 ...

  6. EFCore 2.0引用标量函数

    参考文档:https://www.cnblogs.com/CreateMyself/p/8485697.html 1.添加nuget包:EntityFramework.Functions,在上下文类M ...

  7. ovs-vsctl 命令详解

    Open vSwitch中有多个命令,分别有不同的作用,大致如下: ovs-vsctl用于控制ovs db ovs-ofctl用于管理OpenFlow switch 的 flow ovs-dpctl用 ...

  8. 程序媛计划——mysql基本操作

    本文适用于mac 在官网上下载community 版mysql,选择dmy这种.在终端中安装好mysql. #进入mysql /usr/local/mysql/bin/mysql -uroot -p ...

  9. BZOJ 1001--[BeiJing2006]狼抓兔子(最短路&对偶图)

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 29035  Solved: 7604 Descript ...

  10. CF 798B 渣渣题

    题目链接:http://codeforces.com/contest/798/problem/B 此题是我打河工大校赛前一晚熬夜打CF时硬肛过去的B题,今天补题时,偶然看到dalao的代码,ORZ,s ...