Печать Bindinglist

kalina9001kalina9001 Germany
отредактировано 07:44 Раздел: FastReport .NET
Добрый день!
Ковыряю демо версию 1.1.20.0
Пытаюсь вывести на печать данные находящиеся в потомке BindingList.
Возникло несколько вопросов:
1. При экспорте в Pdf возникает ArgumentException

2. InvalidCastException если одно из свойств обьекта является потомком Nullable<>

3. Создаю отчет в коде, при этом если свойств у объекта много, создаю несколько страниц (к примеру свойства 1-3 на первой странице, свойства 4-6 на второй).
При генерации отчета вывод производится в таком порядке: сначала первая страница (если данных много то несколько страниц), потом вторая (аналогично). Можно ли каким либо образом изменить порядок распечатки?

Тестовый проект находится тут: http://rapidshare.de/files/47540632/FR.rar.html

Спасибо

Комментарии

  • kalina9001kalina9001 Germany
    отредактировано 07:44
    Еще вопрос по локализации:
    В нашей системе пользователь выбирает язык GUI при входе в программу. Как бы Preview окошко заставить использовать тот же язык?
    Искал в EnvironmentSettings, не нашел
  • отредактировано 07:44
    Здравствуйте,

    1,2 - исправил, ждите очередной сборки (сегодня ночью).
    3 - именно таков порядок печати многостраничных отчетов. Возможно, Вам лучше использовать динамический объект "Таблица", чтобы напечатать широкую таблицу (см. отчеты в демо, Table/Column Datasource).
    4 - выполните следующий код:

    Res.LoadLocale(@.....\Russian.frl);

    тут есть одна тонкость - это надо делать после того, как загрузится файл конфигурации FastReport (а это происходит при первом обращении к экземпляру Report). Можно сделать так:

    using (Report report = new Report());
    Res.LoadLocale(@.....\Russian.frl);
  • kalina9001kalina9001 Germany
    отредактировано 07:44
    Спасибо!
    Буду ждать
  • kalina9001kalina9001 Germany
    отредактировано 07:44
    Я правильно понимаю, что свойство объекта ищется по его DisplayName?

    Если это так, то возникает такой вопрос:
    При переводе случается такое, что разные свойства Бизнес Объекта получают одно и тоже DisplayName:
    public class TestItem
    {
    	private SubItem subItem;
    	private TestItem(Guid guid)
    	{
    		this.subItem = new SubItem(guid);
    	}
    		
    	[LocalizedDisplayName("SubItemGuid")]
    	public Guid? SubItemGuid
    	{
    		get { return this.subItem == null? (Guid?)null : this.subItem.Guid; }
    		set { this.LoadSubItem(value); }
    	}
    
     
    	[LocalizedDisplayName("SubItem")]
    	public SubItem SubItemObject
    	{
    		get { return this.subItem; }
    		set { this.subItem = value; }
    	}
    
    	private void LoadSubItem(Guid? guid)
    	{
    		if(guid == null)
    		{
    			this.subItem = null;
    		}
    		else
    		{
    			//Смотрим в базу, подгружаем SubItem
    			this.subItem = new SubItem(guid.Value);
    		}
    	}
    
    	public static IList<TestItem> GetData()
    	{
    		var list = new BindingList<TestItem>();
    		for(int i = 0; i < 100; i++)
    		{
    			var item = new TestItem(Guid.NewGuid());
    			list.Add(item);
    		}
    		return list;
    	}
    }
    
    public class SubItem
    {
    	private readonly Guid guid;
    	public SubItem(Guid value)
    	{
    		this.guid = value;
    	}
    
    	public Guid Guid
    	{
    		get { return this.guid; }
    	}
    	public override string ToString()
    	{
    		return string.Format("SubItem with Guid: {0}", this.Guid);
    	}
    }
    
    public class LocalizedDisplayNameAttribute: DisplayNameAttribute
    {
    	private string displayName;
    	public LocalizedDisplayNameAttribute(string subitem)
    	{
    		//Смотрим в файл ресурсов
    		//Подготовленный переводчиком
    		//Он, идиот, перевел оба наших ключа (SubItemGuid и SubItem) одним и тем словом
    		this.displayName = "Подчиненный обьект";
    	}
    
    	public override string DisplayName
    	{
    		get { return this.displayName; }
    	}
    }
    
    Соответственно в отчете выдаются неправильные данные. Можно как то разрулить эту ситуацию?
    И как собственно дизайнить отчеты для разных языков? Для каждого языка свой?

    ЗЫ. Подал заявку в бухгалтерию на лицензию
  • отредактировано 07:44
    DisplayName используется для задания св-ва Alias колонки данных. Ситуация, когда в источнике данных есть два поля с одинаковым Alias, является нештатной. При этом придется переименовывать вторую колонку, чтобы к ней можно было получить доступ.

    Да, для каждого языка надо делать свой отчет. Языки бывают разные, и помимо замены текста может потребоваться подгонка размеров объектов отчета.
  • kalina9001kalina9001 Germany
    отредактировано 07:44
    Спасибо, понятно. Будем думать
  • kalina9001kalina9001 Germany
    отредактировано June 2009
    Переделал с использованием TableObject, почти что хорошо :) Такая небольшая ошибочка образовалась:
    unbenanntwtp.jpg

    Подозреваю, что сам виноват. Мне нужно иногда в зависимости от атрибутов или типов свойств выдать на печать не результат ToString метода этого свойства, что нибудь другое. Для этого подписываюсь на BeforePrint - event у ячеек TableObject, и присваиваю свйство Text
    Не подскажете как лучше?

    Тестовый проект: http://rapidshare.de/files/47555206/FR.rar.html

    PS. Про алиасы еще думаю. Обнаружил у себя в переводах(ресурсах) точки и квадратные скобки в именах полей
  • отредактировано 07:44
    В этом отчете проблема в том, что на первом проходе получается больше страниц, чем на втором, из-за колонки Password. Это из-за неправильного использования события BeforePrint ячейки таблицы - в этом событии ячейка еще не заполнена данными, а Вы их пытаетесь анализировать.

    Проблема в том, что подходящего события для этой задачи нет - в BeforePrint данных еще нет, а в AfterPrint уже поздно что-либо менять. Я добавил событие AfterData (кто работал с FR VCL - там есть аналог), которое вызывается сразу после того, как объект заполняется данными. Вам надо будет поменять код

    tableObject[col, 1].BeforePrint+=OnBeforePrintPassworsProperty;

    на

    tableObject[col, 1].AfterData+=OnBeforePrintPassworsProperty;
  • kalina9001kalina9001 Germany
    отредактировано 07:44
    Спасибо, попробую!
    И за оперативность отдельное спасибо! :)

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.