摘要:CrystalReport 文字斷行
主要就是常常發生亂斷行,我說40個字斷就斷,不要再給我亂斷行了…
其主要原因,發現若第40個字為數字、符號,這行一定會亂斷了,若在這第40個字後面加一個換行,就不會發生了。
此方法為在程式部分先對資料動手腳,就單純的計算字元的BYTES數,然後加入斷行的特定符號,我習慣用「&N」,接著再用CR的公式用換行來取代掉,就這樣而已。
嫌碼太多的可以自己改嚕…
01
/// <summary>
02
/// ReportBreakLine斷行
03
/// </summary>
04
/// <param name="orignstr">原始字串</param>
05
/// <param name="length">所需"字元"長度(BYTES數)</param>
06
/// <param name="mark">分隔符號</param>
07
/// <returns></returns>
08
public static string ReportBreakLine(string orignstr, int length, string mark)
09
{
10
string result = string.Empty;
11
12
List<int> all_i = new List<int>(); //用來裝每個字的BYTES,再用迴圈去加總
13
14
char[] all_s = orignstr.Trim().ToCharArray();
15
16
for (int i = 0; i < all_s.Count(); i++)
17
{
18
all_i.Add(System.Text.Encoding.Default.GetByteCount(all_s[i].ToString()));
19
}
20
21
int now_t = 0;
22
int end = 0;
23
int now = 0;
24
//若需求是40個字即為80Bytes,若加總為79Bytes時就停止。
25
for (int i = 0; i < all_i.Count(); i++)
26
{
27
if (i + 1 != all_i.Count())
28
{
29
if ((now_t + all_i[i]) <= length)
30
{
31
now_t += all_i[i];
32
end = i;
33
}
34
else
35
{
36
result += orignstr.Substring(now, end - now + 1) + mark;
37
now = i;
38
i--;
39
now_t = 0;
40
}
41
}
42
else
43
{
44
//now_t += all_i[i-1];
45
now_t += all_i[i];
46
47
if (now_t > length)
48
{
49
result += orignstr.Substring(now, all_i.Count() - now - 1) + mark;
50
result += orignstr.Substring(i, 1);
51
}
52
else
53
{
54
result += orignstr.Substring(now, all_i.Count() - now);
55
}
56
}
57
}
58
return result;
59
}
60
/// <summary> 02
/// ReportBreakLine斷行 03
/// </summary> 04
/// <param name="orignstr">原始字串</param> 05
/// <param name="length">所需"字元"長度(BYTES數)</param> 06
/// <param name="mark">分隔符號</param> 07
/// <returns></returns> 08
public static string ReportBreakLine(string orignstr, int length, string mark) 09
{ 10
string result = string.Empty; 11
12
List<int> all_i = new List<int>(); //用來裝每個字的BYTES,再用迴圈去加總13
14
char[] all_s = orignstr.Trim().ToCharArray(); 15
16
for (int i = 0; i < all_s.Count(); i++) 17
{ 18
all_i.Add(System.Text.Encoding.Default.GetByteCount(all_s[i].ToString())); 19
} 20
21
int now_t = 0; 22
int end = 0; 23
int now = 0; 24
//若需求是40個字即為80Bytes,若加總為79Bytes時就停止。25
for (int i = 0; i < all_i.Count(); i++) 26
{ 27
if (i + 1 != all_i.Count()) 28
{ 29
if ((now_t + all_i[i]) <= length) 30
{ 31
now_t += all_i[i]; 32
end = i; 33
} 34
else 35
{ 36
result += orignstr.Substring(now, end - now + 1) + mark; 37
now = i; 38
i--; 39
now_t = 0; 40
} 41
} 42
else 43
{ 44
//now_t += all_i[i-1]; 45
now_t += all_i[i]; 46
47
if (now_t > length) 48
{ 49
result += orignstr.Substring(now, all_i.Count() - now - 1) + mark; 50
result += orignstr.Substring(i, 1); 51
} 52
else 53
{ 54
result += orignstr.Substring(now, all_i.Count() - now); 55
} 56
} 57
} 58
return result; 59
} 60

中間很多都是實測後修改的,用到目前都為正常,由於網路上一直找不到相關的,提供給大家嚕…
CR真的有些功能很難去達成,像垂直置中也沒有,真的蠻苦惱的。