Condition для ячеек CrossTab

Обсуждение Stimulsoft Reports.NET
Ответить
bear
Сообщения: 15
Зарегистрирован: 04 июл 2012, 23:52

Condition для ячеек CrossTab

Сообщение bear »

пытаюсь поставить условие изменение цвета ячейки. условия прописаны, и работают только если Summary установлено в "Sum" если установить "None" - цвета пропадают.
Что я неверно делаю?
Вложения
LaborResultResistenzFrequency.mrt
(23.61 КБ) 380 скачиваний
2015-12-04_17h11_02.png
2015-12-04_17h11_02.png (64.13 КБ) 4519 просмотров
2015-12-04_17h12_36.png
2015-12-04_17h12_36.png (67.76 КБ) 4519 просмотров
HighAley
Сообщения: 1998
Зарегистрирован: 08 июн 2011, 11:36
Откуда: Stimulsoft Office

Re: Condition для ячеек CrossTab

Сообщение HighAley »

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

В случае использования Summary = None, value в Conditions имеет тип object.
Попробуйте в выражении явно преобразовать тип. Например,

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

(decimal)value < 20
На вашем примере проверить не удалось из-за отсутствия данных.
В нашем Demo после данных изменений всё заработало.
Если у вас всё ещё есть проблемы, пришлите нам отчёт с данными.

Спасибо.
Леонид
Сообщения: 329
Зарегистрирован: 23 июл 2009, 09:53
Откуда: Moscow

Re: Condition для ячеек CrossTab

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

Добрый день!

Можно ещё прописать условие явно в событии ProcessCell, например так:

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

decimal value = 0;

if (decimal.TryParse(e.Text, out value))
{
  e.Cell.Field.Brush = (value > 0) ? new StiSolidBrush(Color.Chartreuse) : new StiSolidBrush(Color.Red);
  
  // или, если много условий, то пропишите их и присвойте e.Cell.Field.Brush
}
bear
Сообщения: 15
Зарегистрирован: 04 июл 2012, 23:52

Re: Condition для ячеек CrossTab

Сообщение bear »

спасибо за ответ. попробую

есть ли ссылка на примеры с "ProcessCell"?. некоторые мною найденные ссылки на примеры не работали, а, например, из информации по ссылке http://support.stimulsoft.com/index.php ... -cross-tab не ясно, из какого класса это событие.
Леонид
Сообщения: 329
Зарегистрирован: 23 июл 2009, 09:53
Откуда: Moscow

Re: Condition для ячеек CrossTab

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

Доброе утро!

В вашем отчёте в ячейке CrossTab1_Sum1 в событии ProcessCell прописываете вашу "раскраску" так (можете прямо вставить код, как есть, будет работать, т.к. проверено на вашем же отчёте):

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

double val = 0; // здесь сами смотрите на размерность (у нас в Oracle используется decimal)

// value == null
if (e.Text == string.Empty)
{
  e.Cell.Field.Brush = new StiSolidBrush(Color.DarkGray); // cell color
  e.Cell.Field.TextBrush = new StiSolidBrush(Color.Red); // text color
  return;
}

// прочие условия
if (double.TryParse(e.Text, out val))
{
	if (val > 0 && val < 10.0)
	{
		e.Cell.Field.Brush = new StiSolidBrush(Color.Green);
		return;
	}
	
	if (val >= 10 && val < 50.0)
	{
		e.Cell.Field.Brush = new StiSolidBrush(Color.Yellow);
		return;
	}
	
	if (val >= 50 && val < 90.0)
	{
		e.Cell.Field.Brush = new StiSolidBrush(Color.Brown);
		return;
	}
	
	if (val >= 90)
	{
		e.Cell.Field.Brush = new StiSolidBrush(Color.Red);
		return;
	}
}
В Conditions, соответственно всё удаляете, и можно запускать.

P.S. Так для справки. Всегда смотрите в таких случае, что генерирует код Stimul'а (вкладка Code), в вашем случае Conditions выглядят так (код, понятное дело избыточный, т.к. это написано не человеком):

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

// CheckerInfo: Conditions CrossTab1_Sum1
            object value = 0;
            if (e.Value is object)
            {
                value = ((object)(e.Value));
            }
            string tag = ((StiComponent)sender).TagValue as string;
            string tooltip = ((StiComponent)sender).ToolTipValue as string;
            string hyperlink = ((StiComponent)sender).HyperlinkValue as string;
            if ((value != null && (double)value >= 90))
            {
                ((Stimulsoft.Report.Components.IStiTextBrush)(sender)).TextBrush = new Stimulsoft.Base.Drawing.StiSolidBrush(System.Drawing.Color.Black);
                ((Stimulsoft.Report.Components.IStiBrush)(sender)).Brush = new Stimulsoft.Base.Drawing.StiSolidBrush(System.Drawing.Color.Red);
                Stimulsoft.Report.Components.StiConditionHelper.ApplyFont(sender, new System.Drawing.Font("Arial Narrow", 6F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 0), Stimulsoft.Report.Components.StiConditionPermissions.All);
                ((Stimulsoft.Report.Components.IStiBorder)(sender)).Border = ((Stimulsoft.Base.Drawing.StiBorder)(((Stimulsoft.Report.Components.IStiBorder)(sender)).Border.Clone()));
                ((Stimulsoft.Report.Components.IStiBorder)(sender)).Border.Side = Stimulsoft.Base.Drawing.StiBorderSides.All;
                ((Stimulsoft.Report.Components.StiComponent)(sender)).Enabled = true;
            }
            if ((value != null && (double)value >= 50 && (double)value < 90.0))
            {
                ((Stimulsoft.Report.Components.IStiTextBrush)(sender)).TextBrush = new Stimulsoft.Base.Drawing.StiSolidBrush(System.Drawing.Color.Black);
                ((Stimulsoft.Report.Components.IStiBrush)(sender)).Brush = new Stimulsoft.Base.Drawing.StiSolidBrush(System.Drawing.Color.Orange);
                Stimulsoft.Report.Components.StiConditionHelper.ApplyFont(sender, new System.Drawing.Font("Arial Narrow", 6F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 0), Stimulsoft.Report.Components.StiConditionPermissions.All);
                ((Stimulsoft.Report.Components.IStiBorder)(sender)).Border = ((Stimulsoft.Base.Drawing.StiBorder)(((Stimulsoft.Report.Components.IStiBorder)(sender)).Border.Clone()));
                ((Stimulsoft.Report.Components.IStiBorder)(sender)).Border.Side = Stimulsoft.Base.Drawing.StiBorderSides.All;
                ((Stimulsoft.Report.Components.StiComponent)(sender)).Enabled = true;
            }
            if ((value != null && (double)value >= 10 && (double)value < 50.0))
            {
                ((Stimulsoft.Report.Components.IStiTextBrush)(sender)).TextBrush = new Stimulsoft.Base.Drawing.StiSolidBrush(System.Drawing.Color.Black);
                ((Stimulsoft.Report.Components.IStiBrush)(sender)).Brush = new Stimulsoft.Base.Drawing.StiSolidBrush(System.Drawing.Color.Yellow);
                Stimulsoft.Report.Components.StiConditionHelper.ApplyFont(sender, new System.Drawing.Font("Arial Narrow", 6F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 0), Stimulsoft.Report.Components.StiConditionPermissions.All);
                ((Stimulsoft.Report.Components.IStiBorder)(sender)).Border = ((Stimulsoft.Base.Drawing.StiBorder)(((Stimulsoft.Report.Components.IStiBorder)(sender)).Border.Clone()));
                ((Stimulsoft.Report.Components.IStiBorder)(sender)).Border.Side = Stimulsoft.Base.Drawing.StiBorderSides.All;
                ((Stimulsoft.Report.Components.StiComponent)(sender)).Enabled = true;
            }
            if ((value != null && (double)value > 0 && (double)value < 10.0))
            {
                ((Stimulsoft.Report.Components.IStiTextBrush)(sender)).TextBrush = new Stimulsoft.Base.Drawing.StiSolidBrush(System.Drawing.Color.Black);
                ((Stimulsoft.Report.Components.IStiBrush)(sender)).Brush = new Stimulsoft.Base.Drawing.StiSolidBrush(System.Drawing.Color.PaleGreen);
                Stimulsoft.Report.Components.StiConditionHelper.ApplyFont(sender, new System.Drawing.Font("Arial Narrow", 6F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 0), Stimulsoft.Report.Components.StiConditionPermissions.All);
                ((Stimulsoft.Report.Components.IStiBorder)(sender)).Border = ((Stimulsoft.Base.Drawing.StiBorder)(((Stimulsoft.Report.Components.IStiBorder)(sender)).Border.Clone()));
                ((Stimulsoft.Report.Components.IStiBorder)(sender)).Border.Side = Stimulsoft.Base.Drawing.StiBorderSides.All;
                ((Stimulsoft.Report.Components.StiComponent)(sender)).Enabled = true;
            }
            if ((value == null))
            {
                ((Stimulsoft.Report.Components.IStiTextBrush)(sender)).TextBrush = new Stimulsoft.Base.Drawing.StiSolidBrush(System.Drawing.Color.Red);
                ((Stimulsoft.Report.Components.IStiBrush)(sender)).Brush = new Stimulsoft.Base.Drawing.StiSolidBrush(System.Drawing.Color.Silver);
                Stimulsoft.Report.Components.StiConditionHelper.ApplyFont(sender, new System.Drawing.Font("Arial Narrow", 6F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, 0), Stimulsoft.Report.Components.StiConditionPermissions.All);
                ((Stimulsoft.Report.Components.IStiBorder)(sender)).Border = ((Stimulsoft.Base.Drawing.StiBorder)(((Stimulsoft.Report.Components.IStiBorder)(sender)).Border.Clone()));
                ((Stimulsoft.Report.Components.IStiBorder)(sender)).Border.Side = Stimulsoft.Base.Drawing.StiBorderSides.All;
                ((Stimulsoft.Report.Components.StiComponent)(sender)).Enabled = true;
            }
bear
Сообщения: 15
Зарегистрирован: 04 июл 2012, 23:52

Re: Condition для ячеек CrossTab

Сообщение bear »

спасибо. приму к сведению.

к сожалению, у меня код в закладке Code показывается только в случае ошибок в mrt файле. обычно закладка пустая.
Вложения
2015-12-16_12h23_07.png
2015-12-16_12h23_07.png (52.79 КБ) 4461 просмотр
Jan
Сообщения: 495
Зарегистрирован: 19 фев 2009, 11:14

Re: Condition для ячеек CrossTab

Сообщение Jan »

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

Код не показывается для ускорения работы дизайнера отчетов, для того, чтобы не приходилось перегиенрировать его в случае изменений в отчете. Это критично для многих тяжелых отчетов. Отображение кода можно включить в контекстном меню редактора кода. Посмотрите картинку из приложения.

Спасибо.
Вложения
Code.png
Code.png (215.6 КБ) 4457 просмотров
bear
Сообщения: 15
Зарегистрирован: 04 июл 2012, 23:52

Re: Condition для ячеек CrossTab

Сообщение bear »

спасибо. но было бы нагляднее включать еще и через меню и тулбар.
Подозрительный код в табе с кодом никак не наводит на мысль, что что-то отключено. первая и единственная мысль, что не работает. хотя точно помню, что год назад было и работало.
предлагаю код вообще убрать и сделать кнопку - включить код.
HighAley
Сообщения: 1998
Зарегистрирован: 08 июн 2011, 11:36
Откуда: Stimulsoft Office

Re: Condition для ячеек CrossTab

Сообщение HighAley »

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

Мы попробуем, что-нибудь сделать, чтобы такой проблемы больше не возникало.

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