2009-11-05 1 views
0

У меня есть отчет SQL Reporting Services 2005, который содержит текстовое поле на первой странице. Строковый ввод для текстового поля может быть очень большим и содержать символы новой строки. Размер текстового поля исправлен, а на второй странице отчета добавлено другое текстовое поле для обработки любого текста переполнения, который не помещался в текстовое поле первой страницы. Если текстовое поле второй страницы заполняется, я хотел бы включить в конце текста «...», чтобы показать, что какой-то текст был отключен.Sql Reporting Services 2005 продолжает длинную строку из одного текстового поля в другое текстовое поле

Я пробовал использовать метод TextRenderer.MeasureText(), но, похоже, работает только с одиночными строками. Я пытаюсь следующий код

string str = string.Copy(commentString); 
TextFormatFlags flags = TextFormatFlags.WordBreak | 
         TextFormatFlags.WordEllipsis | 
         TextFormatFlags.ModifyString; 
float textBoxWidthInches = 3.8f; 
float textBoxHeightInches = 3.4f; 
Size size = new Size(
    (int)(textBoxWidthInches * 72 - 2), 
    (int)(textBoxHeightInches * 72 - 2)); 
TextRenderer.MeasureText(str, new Font("Arial", 8), size, flags); 

Я тогда ожидать ул, чтобы включить «\ 0» в точке, где мне нужно, чтобы сломать мою строку, однако, она не отображается. Если я удаляю флаг WordBreak и вводя строку с длинной первой строкой, она включает «\ 0» в правильном месте для первой строки, но она работает только для одной строки.

Мои вопросы:

1) Как "продолжить" текст из одного текстового поля к другому в SQL Reporting Services 2005?

2) Если нет, как я могу рассчитать, где мне нужно сломать свою строку, чтобы она помещалась внутри текстового поля?

3) Возможно, я хотел бы включить «...» в конец второго текстового поля для текста, который длиннее, чем оба текстовых поля могут поместиться.

Edit: То, что я пытаюсь выполнить что-то вроде этого:

|------------------------| 
|      | 
|  Header Page 1  | 
|------------------------| 
|  |    | 
|  |    | 
|TextBox1|    | 
|  |    | 
|--------|    | 
|      | 
| Other Data    | 
|      | 
|      | 
|      | 
|      | 
|      | 
|      | 
|      | 
|------------------------| 


|------------------------| 
|      | 
|  Header Page 2  | 
|------------------------| 
|  |    | 
|  |    | 
|TextBox2|    | 
|  |    | 
|--------|    | 
|      | 
| Other Data    | 
|      | 
|      | 
|      | 
|      | 
|      | 
|      | 
|      | 
|------------------------| 

Затем я хочу TextBox1 продолжать TextBox2 на второй странице. Использование атрибута CanGrow не приведет к желаемому поведению.

ответ

1

Вот что я закончил с:

public static IList<string> WordWrap(
    string text, 
    Font printFont, 
    Graphics graphics, 
    IList<SizeF> sizeF, 
    string tooLongText) 
    { 
    List<string> list = new List<string>(); 
    int charsFit; 
    int linesFilled; 

    foreach (SizeF size in sizeF) 
    { 

     graphics.MeasureString(
      text, 
      printFont, 
      size, 
      new StringFormat(), 
      out charsFit, 
      out linesFilled); 

     char[] whitespace = new[] { ' ', '\t', '\r', '\n' }; 
     int index = charsFit; 

     if (text.Length > charsFit) 
      index = text.LastIndexOfAny(whitespace, charsFit); 

     if (index < 0) index = charsFit; 

     string rv = text.Substring(0, index).Trim(); 
     text = text.Substring(index).Trim(); 
     list.Add(rv); 
    } 

    if (!string.IsNullOrEmpty(text)) 
    { 
     string lastText = list[list.Count - 1]; 
     SizeF size = sizeF[sizeF.Count - 1]; 
     charsFit = 0; 
     string newLastText = lastText + Environment.NewLine + tooLongText; 
     while (charsFit < newLastText.Length) 
     { 
      graphics.MeasureString(
       newLastText, 
       printFont, 
       size, 
       new StringFormat(), 
       out charsFit, 
       out linesFilled); 
      lastText = lastText.Substring(0, lastText.Length - 1); 
      newLastText = lastText + Environment.NewLine + tooLongText; 
     } 

     list.RemoveAt(list.Count - 1); 
     list.Add(newLastText); 
    } 

    return list; 
    } 

затем сгенерировать два свойства публичных строк для моих двух текстовых полей. Если эта функция возвращает список со значением count> 0, первое значение textbox = list [0].Если количество списков> 1, второе значение текстового поля = список [1]. Не лучший код, я уверен, но он работал для моих нужд.

0

Когда установлено CanGrow, текстовое поле будет разделено более чем на одну страницу, если высота больше, чем страница. например. Текстовое поле сначала переместится на вторую страницу, если оно разделяет страницу с другим элементом управления. См. here.

Если у вас есть, чтобы вырезать текстовое поле на двух страницах, вы можете установить размер текстового поля на 2 страницы, а затем установить CanGrow на false и CanShrink на true. Таким образом, текстовое поле всегда будет меньше, чем 2 страницы.

Затем проверьте количество строк в тексте (возможно, вам придется написать функцию для этого), в отличие от строк, которые, как вы знаете, могут помещаться в текстовое поле, чтобы контролировать видимость другого текстового поля, содержащего сообщение «Дальнейший текст усечен ».

+0

Спасибо за ответ, но я все время пробовал использовать CanGrow и CanShrink и не могу получить желаемое поведение. Я отредактировал свое сообщение, чтобы привести пример желаемого результата. – Ezweb

0

Вы также можете приблизиться к этой ситуации, используя таблицу, группировки и разбивку по каждой группе. Поэтому страница 1 будет первым значение group1 и стр.2 будет вторым значением group1 и т.д.

группы подробно будет содержанием страницы (или вы могли бы добавить больше группировки, если вам нравится)