自动换行的两种代码(C#)
最近有个需求,需要将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#)的更多相关文章
- jquery添加select option两种代码思路比较
功能需求:在客户选择了check_in_date和check_out_date之后,将在check_in_date至check_out_date的promotions中自动添加符合条件的promoti ...
- 小记:iOS 中一般对于 view 不依赖 model 的的两种代码书写形式
一. 前言 对于在 MVC 的定义中,view 层是不引用 model 层,view 和 model 是不相往来的 一般开发中,我们都写过 在自定义 view 中增加一个 model 的属性,外接直接 ...
- webpack 安装vue(两种代码模式compiler 和runtime)
使用webpack安装vue,import之后,运营项目报错,如下: [Vue warn]: You are using the runtime-only build of Vue where the ...
- java 22 - 10 多线程之两种代码实现方式的比较与区别
- 说一说Web开发中两种常用的分层架构及其对应的代码模型
昨天妹子让我帮她解决个问题,本以为可以轻松搞定,但是打开他们项目的一瞬间,我头皮发麻.本身功能不多的一个小项目,解决方案里竟然有几十个类库.仅仅搞明白各个类库的作用,代码层次之间的引用关系就花了一个多 ...
- jsp中两种include的区别【转】
引用文章:http://www.ibm.com/developerworks/cn/java/j-jsp04293/ http://www.cnblogs.com/lazycoding/archive ...
- 多重背包问题的两种O(M*N)解法
多重背包的题目很多,最著名的是poj1742楼教主的男人八题之一. poj1742:coins 有几种面值的钱币和每种的数量,问能够组成m以内的多少种钱数 这个题大家都归为多重背包问题,不过跟实际意义 ...
- 基于VC++ Win32+CUDA+OpenGL组合与VC++ MFC SDI+CUDA+OpenGL组合两种方案的遥感影像显示:获得的重要结论!
1.基于VC++ Win32+CUDA+OpenGL组合的遥感影像显示 在该组合方案下,初始化时将OpenGL设置为下面两种方式,效果一样 //设置方式1 glutInitDisplayMode (G ...
- 【代码笔记】iOS-向服务器传JSON数据的两种方式
一,代码. - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. ...
随机推荐
- readLine() 和 "\r","\n" 问题
很多输入流中都有一个函数readLine(),我们也经常使用这个函数,但有时如果不认真考虑,这个函数也会带来一些小麻烦. 如果我们是从控制台读入的话,我们也许没有想过readLine函数到底是根据&q ...
- lua的table的删除操作
直接使用table的remove方法 , , } table.remove(tab) --默认删除最后一个元素,第二个参数可以指定删除位置 删除后,后面的元素会往前移动.有点像C++的std::vec ...
- 动态类型和匿名类型在asp.net webapi中的应用
1. 动态类型用于webapi调用 假设需要调用一个webapi,webapi返回了一个json字符串.字符串如下: {"ProductId":"AN002501&qu ...
- TFS Java SDK使用指南
[2018.3.6 更新] 最新版本的TFS Java SDK(14.123.1)支持Java SDK 1.6版本,可以从Oracle的官方网站(http://www.oracle.com/techn ...
- jenkins 后台程序运行
# 背景 jenkins持续集成,需要任务后台执行(nohup执行)结果发现jenkins的job执行完后,看不到运行的进程 # 步骤 原因就是这么一个情况:Jenkins任务结束时候自动关掉了所有的 ...
- AbpZero的Swagger汉化之旅
做汉化主要是为了出一份前后端都能看得懂的在线文档,废话不多说,我们开始准备, 我们要在启动项目的Startup.cs中重定向一下swagger的读取方式 1.在这个类下面,新增一个方法: public ...
- 解决:百度编辑器UEditor,怎么将图片保存到图片服务器,或者上传到ftp服务器的问题(如果你正在用UE,这篇文章值得你看下)
在使用百度编辑器ueditor的时候,怎么将图片保存到另一个服务器,或者上传到ftp服务器?这个问题,估计很多使用UE的人会遇到.而且我百度过,没有找到这个问题的解决方案.那么:本篇文章就很适合你了. ...
- 记录.NET Core部署到Linux之发布项目到Linux(2)
1.选择文件夹发布项目到本地,通过Xftp上传文件到/home/wwwroot下:下面具体介绍下 2.通过Xftp直接拖拽压缩包到linux下,通过命令cd /home/wwwroot目录下;然后输入 ...
- WireShark 查看UDP码流的丢包率
1.用wireshark抓包之后,右击,点decode as,转化为RTP 2. 点show all streams 3.分析
- Python常用第三方模块(长期更新)
1.keyboard #监控键盘 2.PIL#处理图片 3.operator #操作列表 4.shelve #数据存储方案 保存dat文件 5.optparse #处理命令行参数 6.configpa ...