Доступ к элементам бизнес-объекта по индексу

Обсуждение Stimulsoft Reports.NET
Ответить
nnspu
Сообщения: 9
Зарегистрирован: 11 фев 2015, 16:22

Доступ к элементам бизнес-объекта по индексу

Сообщение nnspu »

Добрый день!
Зарегистрировал как бизнес-объект список объектов типа DseInfo, в свойстве Attributes которых список возможных атрибутов
Хотелось бы построить отчет, который представляет собой таблицу с тремя колонками, например:
1. DseInfo.Name
2. DseInfo.Description
3. DseInfo.Attributes["Тип"]
С последней колонкой возникли затруднения. Как написать выражение таким образом, чтобы получить значение по индексу элемента в подчиненном бизнес-объекте?

Код: Выделить всё

void Main()
{
	var list = new List<DseInfo>();
	
	var dse1 = new DseInfo{Name = "Болт",Description = "Крепежный болт"};
	dse1.Attributes["Тип"] = "Деталь";
	dse1.Attributes["Материал"] = "Сталь";

	var dse2 = new DseInfo{Name = "Ящик",Description = "Упаковка"};
	dse2.Attributes["Тип"] = "Сборочная единица";

	list.AddRange(new []{dse1,dse2});

	var report = new StiReport();
	report.RegBusinessObject("dseList",list);
	report.Design();
}

public class DseInfo
{
	public string Name {get;set;}
	public string Description {get;set;}
	public DseAttributes Attributes {get;private set;}
	public DseInfo()
	{
		Attributes = new DseAttributes();
	}
}

public class DseAttributes : List<DseAttribute>
{
	public string this[string name]
	{
		get
		{
			var attr = this.FirstOrDefault(t=>t.Name.Equals(name,StringComparison.InvariantCultureIgnoreCase));
			if (attr == null)
				return "";
			else
				return attr.Value;
		}
		set
		{
			var attr = this.FirstOrDefault(t=>t.Name.Equals(name,StringComparison.InvariantCultureIgnoreCase));
			if (attr == null)			
			{
				attr = new DseAttribute{Name = name,Value = value};
				this.Add(attr);
			}
			else
			{
				attr.Value = value;
			}
		}
	}
	
}

public class DseAttribute
{
	public string Name { get; set; }
	public string Value {get;set;}
}
Леонид
Сообщения: 329
Зарегистрирован: 23 июл 2009, 09:53
Откуда: Moscow

Re: Доступ к элементам бизнес-объекта по индексу

Сообщение Леонид »

Добрый вечер!

Ваш вложенный класс не виден, т.к. нужно синхронизировать бизнес-объекты так с помощью процедуры report.Dictionary.SynchronizeBusinessObjects(2), например так:

var report = new StiReport();
report.RegBusinessObject("dseList", dseList);
report.Dictionary.SynchronizeBusinessObjects(2); <---- Обратите внимание на maxLevel, т.е. уровень вложений
report.Design();undefined
nnspu
Сообщения: 9
Зарегистрирован: 11 фев 2015, 16:22

Re: Доступ к элементам бизнес-объекта по индексу

Сообщение nnspu »

Синхронизация бизнес объектов помогла лишь увидеть дочерний бизнес-объект.
Проблема у меня в другом: я не могу в одной таблице вывести значение конкретного атрибута из Attributes наряду со свойствами родительского DseInfo. Вместо этого получается лишь создать дочернюю таблицу, где будут перечислены все атрибуты из Attributes.
Во вложении пример отчета, где поясняется, что именно мне требуется
Вложения
Report.mrt
(6.94 КБ) 304 скачивания
HighAley
Сообщения: 1998
Зарегистрирован: 08 июн 2011, 11:36
Откуда: Stimulsoft Office

Re: Доступ к элементам бизнес-объекта по индексу

Сообщение HighAley »

Здравствуйте.

Для доступа к атрибутам попробуйте использовать следующее выражение:

Код: Выделить всё

DseInfo.CurrentObject.Attributes["Тип"]
Спасибо.
nnspu
Сообщения: 9
Зарегистрирован: 11 фев 2015, 16:22

Re: Доступ к элементам бизнес-объекта по индексу

Сообщение nnspu »

Здравствуйте
Aleksey Andreyanov писал(а):Здравствуйте.

Для доступа к атрибутам попробуйте использовать следующее выражение:

Код: Выделить всё

DseInfo.CurrentObject.Attributes["Тип"]
Спасибо.
DseInfo.Current - имеет тип object, поэтому данный код не работает, но он направил в нужное русло
В моем случае на этапе проектирования отчета я не имею доступа к метаданным типа DseInfo, поэтому пришлось в теле отчета StimulSoft написать метод, позволяющий, используя отражение, получить значение атрибута по его имени для текущего бизнес-объекта DseInfo

Код: Выделить всё

		public static string GetAttrValue(Stimulsoft.Report.Dictionary.StiBusinessObject obj, string attrName)
		{
			var type = obj.Current.GetType();
			var methodInfo = type.GetMethod("GetAttrValue");
			return methodInfo.Invoke(obj.Current,new []{attrName}).ToString();
		}

При этом выражение для текстового поля в отчете приняло вид

Код: Выделить всё

GetAttrValue(DseInfo,"Тип")
Работает так, как надо. Спасибо!
HighAley
Сообщения: 1998
Зарегистрирован: 08 июн 2011, 11:36
Откуда: Stimulsoft Office

Re: Доступ к элементам бизнес-объекта по индексу

Сообщение HighAley »

Здравствуйте.

Спасибо за описание решения проблемы.
Оно может быть полезно другим пользователям.
Обращайтесь, если вам необходима ещё помощь.

Спасибо.
Ответить