自动换行的两种代码(C#)

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

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

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

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

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

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

思路一:

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

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

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

详细看代码:

 1 /*
 2  *字符串换行,考虑到空格,以及完整单词的情况
 3  *@param inputStr 要换行的字符串
 4  *@param textWidth 固定的长度,超过这个长度则进行换行
 5  *
 6  */
 7 public List<string> listBoxWordWrap(string inputStr, int textWidth)
 8 {
 9     List<string> tempList = new List<string>();//临时存放拼接字符串的列表
10     List<string> lastList = new List<string>();//最终的数据
11     int strLength = inputStr.Length;//获取要换行字符串的长度
12     if (strLength > textWidth)
13     {
14         string[] listArray = inputStr.Split(‘ ‘);//先把字符串分割成一个个单词,后面再重新连接
15         string joinStr = "";
16         string theDeleteStr = "";//用来存放因为增加了它才超过固定长度的那个单词。
17         for (int j = 0; j < listArray.Length; j++)
18         {
19             tempList.Add(listArray[j]);//把分割好的单词 一个个的往list里面添加
20             joinStr = String.Join(" ",tempList.ToArray());//然后转化成字符串
21             //每添加一个都跟固定长度比较一下,当小的时候,继续添加;如果大于的时候进入判断
22             if (joinStr.Length > textWidth)
23             {
24                 //因为大于了固定长度,所以把最后一个单词删掉,删掉后的字符串为一条完整的记录,
25                 int lastSpaceIndex = joinStr.LastIndexOf(" ");
26                 lastList.Add((theDeleteStr+" "+joinStr.Substring(0, lastSpaceIndex)).Trim());
27                 theDeleteStr = listArray[j];
28                 //刚好是最后一个的时候
29                 if (j == listArray.Length - 1)
30                     lastList.Add(theDeleteStr);
31
32                 tempList.Clear();//清空临时list
33             }
34             else if (j == listArray.Length - 1)//当遍历到结尾,剩下的当做最后一行
35             {
36                 lastList.Add((theDeleteStr+" "+joinStr).Trim());
37                 tempList.Clear();
38             }
39         }
40     }
41     return lastList;
42 }

思路二:

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

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

详细看代码:

 1 /*
 2  *字符串换行,考虑到空格,以及完整单词的情况
 3  *@param inputStr 要换行的字符串
 4  *@param textWidth 固定的长度,超过这个长度则进行换行
 5  *
 6  */
 7 public List<string> listBoxWordWrap2(string inputStr, int textWidth)
 8 {
 9     List<string> list = new List<string>();
10     List<string> lastList = new List<string>();
11     string str = inputStr;
12     int textWidth = 64;
13     if (str != "" || str != null)
14     {
15         int strLength = str.Length;
16         if (strLength > textWidth)
17         {
18             string[] listArray = str.Split(‘ ‘);//先把字符串分割成一个个单词,后面再重新连接
19             string joinStr = "";//连接起来的字符串
20             string nextStr = "";//再添加多一个元素的连接字符串
21             for (int j = 0; j < listArray.Length; j++)
22             {
23                 list.Add(listArray[j]);
24                 joinStr = String.Join(" ", list.ToArray());
25                 //通过 当前字符串比固定长度小,但下一个字符串比固定长度大来判断换行处
26                 if(joinStr.Length < textWidth && j < listArray.Length-1){
27                     list.Add(listArray[j+1]);
28                     nextStr = String.Join(" ",list.ToArray());
29                     if (nextStr.Length > textWidth)
30                     {
31                         lastList.Add(joinStr);
32                         list.Clear();
33                     }
34                     else
35                         list.Remove(listArray[j+1]);
36                 }
37                 else if (j == listArray.Length - 1)
38                 {
39                     lastList.Add(joinStr.Trim());
40                     list.Clear();
41                 }
42             }
43
44         }
45     }
46     return lastList;
47 }

时间: 2024-07-30 05:41:44

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

创建后台任务的两种代码模式

创建后台任务的两种代码模式 后台任务是每个App都需要的一些行为,毕竟主线程是大爷,拖不起,伤不起,脏活累活都只能在不见天日的后台去做. 最简单的后台任务,可以说是直接开一个线程就可以了,或者说来个Service,再开个线程.但这些并不是官方认证的最佳实践,实际上,Google早就考虑到了这一点,并把这些需求进行了封装,给我们提供了非常好的后台任务解决方案,并在Training上进行了讲解: 官网镇楼: https://developer.android.com/training/best-ba

离散化的思想和它的两种代码与区别

离散化的思想和它的两种代码与区别 2017年06月15日 12:44:41 AC之路有笑有泪 阅读数:6905 版权声明:觉得好的话就给他人分享一下吧,欢迎转载,码字不容易啊,转载麻烦注明出处 https://blog.csdn.net/xiangAccepted/article/details/73276826 离散化是什么:一些数字,他们的范围很大(0-1e9),但是个数不算多(1-1e5),并且这些数本身的数字大小不重要,重要的是这些数字之间的相对大小(比如说某个数字是这些数字中的第几小,

百度文库评分两种代码写法

<!doctype html> <html> <head> <meta charset="utf-8"> <title>无标题文档</title> <style> #wrap{ width:400px; height:50px; border:1px #CCCCCC solid; margin: 40px auto; text-align:center; line-height:50px; } .hid

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

1.基于VC++ Win32+CUDA+OpenGL组合的遥感影像显示 在该组合方案下,初始化时将OpenGL设置为下面两种方式,效果一样 //设置方式1 glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA); //设置方式2 glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); 从遥感影像数据中提取出像素数据,可将其中的R.G.B三通道依次赋值给OpenGL的像素缓冲区对象 (PBO,Pixel Buffer Obje

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 选择调用的进程为 24 i386 getuid sys_getuid1647 i386 getgid sys_getgid16 使用库函数API方式 使用C代码中嵌入汇编代码方式

实验--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用(杨光)

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 攥写人:杨光  学号:20135233 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验要求: 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/sys

css如何实现一个文字两种颜色代码实例

css如何实现一个文字两种颜色代码实例:在实际应用中可能需要设置文本效果比较炫酷.有一种效果就是将一个文字设置为两种颜色,使用普通的方法肯定是无法实现.下面就分享一下实现此功能的代码实例: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="author" content="http://www.softwhy.com/&qu

推送代码到GitHub上的两种方式

要想将本地Git上代码提交到GitHub可以使用两种协议进行提交,分别使用HTTPS和SSH两种协议,如下所示. 当使用HTTPS协议时,每次推送的时候都需要输入GitHub平台的用户名密码. 当使用SSH协议时,需要在本地配置一个SSH的私钥文件,并注册到GitHub平台上,这样不必每次提交时都使用用户名密码. 具体的配置可以使用一下这种方式,项目URL可以使用HTTPS协议,但是推送URL使用SSH协议并制定本地的密钥文件. 以下介绍如何生成相关的密钥. 打开PuTTYGen这个程序. 点击

程序打印自身代码的两种方法

程序打印自身代码的两种方法 方法一:利用fopen,打开可执行程序对应的source code file /***************************************** code writer : EOF code file : print_my_self.c code date : 2014.08.01 e-mail: [email protected] code purpose : Aha, print out myself! *********************