Добрый день
Пытаюсь разобраться с построением отчета с множественным выбором параметров.
Скажу сразу, что примеры я смотрел, но именно такой реализации не нашел.
Есть источник данных, в который отбирается некий список исходя из выбранных значений второго источника данных.
Например, есть таблица Товаров, и мне надо сделать отчет, в диалоговой форме которого я могу выбрать несколько групп товаров, в которых эти товары находятся.
Т.е. я использую контрол CheckedListBoxControl.
В вашем примере "Selecting Rows" я не сильно понял, как это реализовано - вроде бы одним источником данных с фильтром по бэнду Дата.
По идее, надо делать условие
Where ggID in (@ggID)
Но, в каком виде созвращаются значения из контрола CheckedListBoxControl и как их мне передать в отчет?
Отчет с множественным выбором параметров
Отчет с множественным выбором параметров
Здравствуйте.
В прммере SelectingRows используется свойство Control объекта StiCheckedListBoxControl, которое является обычным CheckedListBox из .Net.
Вот код для установки всех значений в этом CheckedListBox в состояние 'checked':
for (int index = 0; index < CheckedListBoxControl1.Control.Items.Count; index++)
{
CheckedListBoxControl1.Control.SetItemChecked(index, true);
}
Все строки появляются автоматически при загрузке формы, поскольку заполнено свойство Items = Products.ProductName
Каждая строка в таблице имеет свой номер и в соответствии с этим номером мы либо включаем, либо выключаем DataBand в событии BeforePrintEvent:
DataBand1.Enabled = CheckedListBoxControl1.Control.GetItemChecked(DataBand1.Position);
В Вашем случае Вам придется сравнивать не индекс, а текстовое значение элемента списка:
checkedListBoxControl1.Control.Items[index].ToString()
Более подробную информацию о работе CheckedListBox Вы можете найти здесь:
http://en.csharp-online.net/CheckedListBox
http://msdn2.microsoft.com/en-us/librar ... s.80).aspx
Спасибо.
В прммере SelectingRows используется свойство Control объекта StiCheckedListBoxControl, которое является обычным CheckedListBox из .Net.
Вот код для установки всех значений в этом CheckedListBox в состояние 'checked':
for (int index = 0; index < CheckedListBoxControl1.Control.Items.Count; index++)
{
CheckedListBoxControl1.Control.SetItemChecked(index, true);
}
Все строки появляются автоматически при загрузке формы, поскольку заполнено свойство Items = Products.ProductName
Каждая строка в таблице имеет свой номер и в соответствии с этим номером мы либо включаем, либо выключаем DataBand в событии BeforePrintEvent:
DataBand1.Enabled = CheckedListBoxControl1.Control.GetItemChecked(DataBand1.Position);
В Вашем случае Вам придется сравнивать не индекс, а текстовое значение элемента списка:
checkedListBoxControl1.Control.Items[index].ToString()
Более подробную информацию о работе CheckedListBox Вы можете найти здесь:
http://en.csharp-online.net/CheckedListBox
http://msdn2.microsoft.com/en-us/librar ... s.80).aspx
Спасибо.
Отчет с множественным выбором параметров
Добрый день
У меня возникли сложности в реализацией отчета.
Как получилось сделать:
1. Создал переменную cIDs, в которую буду передавать набор гуидов.
2. В главном запросе поставил условие:
where (PATINDEX('%'+cast(c.cID as varchar(40))+'%', @cIDs) > 0)
3. На диалоговую форму положил компонент CheckListBoxControl (имя LB). В свойствах Items выбрал из источника данных поле сName.
4. На диалоговую форму положил еще один компонент CheckListBoxControl (имя LBValues). Сделал его невидимым. В свойствах Items выбрал из источника данных поле сID.
5. На кнопку ОК навесил обработчик:
cIDs = string.Empty;
CheckedListBox tempControl = (CheckedListBox)LB.Control;
if (tempControl.CheckedIndices.Count > 0)
{
for(int i = 0; i < tempControl.CheckedIndices.Count; i++)
{
cIDs += "'" + LBValues.Items[tempControl.CheckedIndices].ToString() + "', " ;
}
}
Т.е. в итоге данные отображаются в одном листбоксе, а гуиды передаются с другого.
Отсюда и возникают вопросы:
1. Насколько верная данная реализация? Может есть проще способ?
2. Можно ли как-то передавать гуиды с основного листбокса? Иначе получилось только если сделать другой скрытый листбокс.
У меня возникли сложности в реализацией отчета.
Как получилось сделать:
1. Создал переменную cIDs, в которую буду передавать набор гуидов.
2. В главном запросе поставил условие:
where (PATINDEX('%'+cast(c.cID as varchar(40))+'%', @cIDs) > 0)
3. На диалоговую форму положил компонент CheckListBoxControl (имя LB). В свойствах Items выбрал из источника данных поле сName.
4. На диалоговую форму положил еще один компонент CheckListBoxControl (имя LBValues). Сделал его невидимым. В свойствах Items выбрал из источника данных поле сID.
5. На кнопку ОК навесил обработчик:
cIDs = string.Empty;
CheckedListBox tempControl = (CheckedListBox)LB.Control;
if (tempControl.CheckedIndices.Count > 0)
{
for(int i = 0; i < tempControl.CheckedIndices.Count; i++)
{
cIDs += "'" + LBValues.Items[tempControl.CheckedIndices].ToString() + "', " ;
}
}
Т.е. в итоге данные отображаются в одном листбоксе, а гуиды передаются с другого.
Отсюда и возникают вопросы:
1. Насколько верная данная реализация? Может есть проще способ?
2. Можно ли как-то передавать гуиды с основного листбокса? Иначе получилось только если сделать другой скрытый листбокс.
Отчет с множественным выбором параметров
Здравствуйте.
Возможен также следующий подход: Вы создаете коллекцию объектов для компонента CheckedListBox. Каждый объект из этой коллекции содержит список необходимых Вам полей. В FormLoad основной диалоговой формы Вы присваиваете этот список объектов в компонент CheckedListBox.Control. Также должен быть переопределен метод ToString() этого компонента, который будет возвращать отображаемое значение в CheckedListBox.
Спасибо.
Возможен также следующий подход: Вы создаете коллекцию объектов для компонента CheckedListBox. Каждый объект из этой коллекции содержит список необходимых Вам полей. В FormLoad основной диалоговой формы Вы присваиваете этот список объектов в компонент CheckedListBox.Control. Также должен быть переопределен метод ToString() этого компонента, который будет возвращать отображаемое значение в CheckedListBox.
Спасибо.