最近有個需求,需要將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 }