Страница 1 из 1

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

Добавлено: 27 фев 2015, 15:28
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;}
}

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

Добавлено: 27 фев 2015, 18:02
Леонид
Добрый вечер!

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

var report = new StiReport();
report.RegBusinessObject("dseList", dseList);
report.Dictionary.SynchronizeBusinessObjects(2); <---- Обратите внимание на maxLevel, т.е. уровень вложений
report.Design();undefined

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

Добавлено: 27 фев 2015, 18:15
nnspu
Синхронизация бизнес объектов помогла лишь увидеть дочерний бизнес-объект.
Проблема у меня в другом: я не могу в одной таблице вывести значение конкретного атрибута из Attributes наряду со свойствами родительского DseInfo. Вместо этого получается лишь создать дочернюю таблицу, где будут перечислены все атрибуты из Attributes.
Во вложении пример отчета, где поясняется, что именно мне требуется

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

Добавлено: 02 мар 2015, 09:56
HighAley
Здравствуйте.

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

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

DseInfo.CurrentObject.Attributes["Тип"]
Спасибо.

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

Добавлено: 03 мар 2015, 09:25
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,"Тип")
Работает так, как надо. Спасибо!

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

Добавлено: 03 мар 2015, 10:14
HighAley
Здравствуйте.

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

Спасибо.