自動換行的兩種代碼(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 }
View Code

     思路二:

           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 }
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM