2013年1月31日 星期四

[C#]Crystal Report自動調大亂斷行

最近開始使用Crystal Report真的是問題多多,
其中一個考倒我也考倒同事的就是它會亂斷行,
只要內容同時包含半形字又有全形字的時候就會出現這樣的狀況,
無論我怎麼設定都沒辦法解決,只能靠Google大神了!
找了很久,總算讓我挖到一篇,它是用程式讓內容自動斷行的,
大家可以參考一下:
http://www.dotblogs.com.tw/tf30412/archive/2010/05/20/15348.aspx

只要把它加入你的程式碼,要用的時候再加入即可
/// <summary>文字斷行設定,以Byte計算</summary>
/// <param name="orignstr">字串</param>
/// <param name="length">單行文字長度</param>
/// <param name="mark">換行符號</param>
public static string ReportBreakLine(string orignstr, int length, string mark)
{
    string result = string.Empty;
    List<int> all_i = new List<int>(); //用來裝每個字的BYTES,再用迴圈去加總
    char[] all_s = orignstr.Trim().ToCharArray();
    for (int i = 0; i < all_s.Length; i++)
    {
        all_i.Add(System.Text.Encoding.Default.GetByteCount(all_s[i].ToString()));
    }

    int now_t = 0;
    int end = 0;
    int now = 0;
    //若需求是40個字即為80Bytes,若加總為79Bytes時就停止。
    for (int i = 0; i < all_i.Count; i++)
    {
        if (i + 1 != all_i.Count)
        {
            if ((now_t + all_i[i]) <= length)
            {
                now_t += all_i[i];
                end = i;
            }
            else
            {
                result += orignstr.Substring(now, end - now + 1) + mark;
                now = i;
                i--;
                now_t = 0;
            }
        }
        else
        {
            now_t += all_i[i];

            if (now_t > length)
            {
                result += orignstr.Substring(now, all_i.Count - now - 1) + mark;
                result += orignstr.Substring(i, 1);
            }
            else
            {
                result += orignstr.Substring(now, all_i.Count - now);
            }
        }
    }
    return result;
}

沒有留言:

張貼留言