最近有个需求,需要将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. 日志记录的作用和方法 java

    程序中记录日志一般有两个目的:Troubleshooting和显示程序运行状态.好的日志记录方式可以提供我们足够多定位问题的依据.日志记录大家都会认为简单,但如何通过日志可以高效定位问题并不是简单的事 ...

  2. java多线程 —— 两种实际应用场景模拟

    最近做的偏向并发了,因为以后消息会众多,所以,jms等多个线程操作数据的时候,对共享变量,这些要很注意,以防止发生线程不安全的情况. (一) 先说说第一个,模拟对信息的发送和接收.场景是这样的: 就像 ...

  3. Nginx an upstream response is buffered to a temporary file

    1.错误日志:warn:an upstream response is buffered to a temporary file 解决办法:增加fastcgi_buffers 8 4K;     fa ...

  4. Log4Net从Mvc转到.Net Core

    原项目用的Log4Net,不过版本比较旧,在Core里新版也进行了支持,本文用的是现在最新版本2.0.8 1.LogHelper帮助类放另一个类库中 Log/LogHelper.cs 2.单独建的配置 ...

  5. js获取select下拉框的value值和text文本值

    介绍一种取下拉框值以及绑定下拉框数据的方法    这里用到的jquery-ui-multiselect插件 1.前台html代码 <span class="ModuleFormFiel ...

  6. 构建NetCore应用框架之实战篇系列

    构建NetCore应用框架之实战篇 构建NetCore应用框架之实战篇(一):什么是框架,如何设计一个框架 构建NetCore应用框架之实战篇(二):BitAdminCore框架定位及架构 构建Net ...

  7. Openlayers地图量算功能

    http://openlayers.org/en/latest/examples/measure.html?q=measure   按官网的例子来就行,新建对象时注意加上命名空间   var vect ...

  8. 区别script中的type=”text/javascript”和language=”Javascript”

    内容提要 在制作网页的时候,往往需要在页面中使用客户端能够运行的JS代码,因此,都需要添加引用.JS引用一般有type="text/javascript"和language=&qu ...

  9. log Log4NET配置

    Log4Net是用来记录日志的,可以将程序运行过程中的信息输出到一些地方(文件.数据库.EventLog等),日志就是程序的黑匣子,可以通过 日志查看系统的运行过程,从而发现系统的问题.日志的作用:将 ...

  10. centos7 安装django

    环境:centos7.4  ,python用的venv 3.6 ,django 2.1 注意点:django2.2再使用venv环境的时候会报SQList版本不足问题,升级数据库太费劲,不如重来 安装 ...