Работа с компонентами
Listopad
Хабаровск
Как очистить DataSelector?
К примеру, я выбрала какие то строки и они появились в правой части DataSelector'а.
Как мне их оттуда удалить? Каким методом?
К примеру, я выбрала какие то строки и они появились в правой части DataSelector'а.
Как мне их оттуда удалить? Каким методом?
Комментарии
И еще: там кнопки не работают. )))
Если к примеру выбрать один элемент, то кнопка [<] не работает. Да и вообще они работют странно. Если переместить все элементы списка в правую часть и обратно, то кнопка [>] неактивна...
Здорово, как все оперативно. ) Спасибо вам. )))
У меня два вопроса по поводу ListBox.
Пример:
Есть два компонента ListBox1 и ListBox2, для них из БД выбрано с помощью sql-запроса два списка - Table1, Table2:
Table1 - главные организации, у каждой из которых есть уникальный код Table1.id.
Table2 - подчиненные организации, каждая из которых относится к одной из главных организации. Table2.owner_id - код главной организаци, к кторой относится подчиненная.
ListBox1.DataColumn = "Table1.name"; - названия главных организаций.
ListBox2.DataColumn = "Table2.name"; - названия подчиненных организаций.
После выбора в ListBox1 строки с нужной организацией мне необходимо получить ее id из таблица Table1. Тут возникает первый вопрос. Для того, чтобы получить код id, мне было бы удобнее получить его из выбранного элемента. Для этого у него должно быть два свойства - текст и значение, где текст - название организации, а значение - ее код. Я не нашла в FastReport возможности установить для ListBox подобные свойства. Подскажите, пожалуйста, как это реализовать? Так как пока я не поняла, как прописать эти свойства, мне приходится использовать следующий код:
string name = "";
string id = "";
for(int index = 0; index < ListBox1.Items.Count; index ++)
if (ListBox1.ListBox.GetSelected(index) == true)
name = ListBox1.ListBox.GetItemText(ListBox1.ListBox.Items[index]);
if (order_name != "")
{
DataSourceBase ds2 = Report.GetDataSource("Table1");
ds2.Init();
while (ds2.HasMoreRows)
{
if ((string)Report.GetColumnValue("Table1.name") == name)
id = Report.GetColumnValue("Table1.id").ToString();
ds2.Next();
}
}
Вот такой вот глупый код.)))
Теперь второй вопрос.
Я получила код главной организации. Теперь я хочу, чтобы в ListBox2 отобразились все подчиненные организации для выбранной главной.
В обработчике щелчка по ListBox1 после получение Table1.id я формирую текст запроса для Table2:
TableDataSource data = Report.GetDataSource("Table2") as TableDataSource;
data.SelectCommand = "select * from Table2 where owner_id = '"+id+"'";
Какой метод использовать для обновления списка ListBox2? Я пробовала ListBox2.FillData(); Не работает.
Подскажите, пожалуйста, что я делаю не так и как мне реализовать поставленную задачу?
Жду Ваш ответ.
Подскажите, пожалуйста, как мне обратотать событие раскрытия списка для узла дерева?
Это так называемая каскадная фильтрация, краткое описание здесь:
http://fast-report.com/documentation/UserM...tafiltering.htm
Краткое - потому что надо настроить только одно св-во (ListBox1.DetailControl = ListBox2).
Также см. отчет в демо - "Dialogs/Cascaded Data Filtering".
Покажу на примере, как работать с двумя списками - Customers и Orders.
- ListBox1.DataColumn = Customers.CompanyName
- ListBox2.DataColumn = Orders.OrderDate
- ListBox1.DetailControl = ListBox2
Таблицы должны быть связаны либо отношением (relation), либо через sql where.
Вариант 1: обе таблицы содержат все данные (select * from Customers; select * from Orders). Надо настроить связь между ними:
http://fast-report.com/documentation/UserM...aterelation.htm
Вариант 2: таблица Customers содержит все данные (select * from Customers), таблица Orders - частичные. Делаем следующий sql (пример на MS SQL, в других БД параметр объявляется иначе):
select * from Orders where CustomerId = @id
настраиваем параметр:
Name = id
DataType = integer (соответствует типу поля Customers.Id)
DefaultValue = 0
Expression = [Customers.Id]
Всё. Весь тот код, что Вы написали, пытаясь получить Id - он не нужен. Главное - правильно настроить связь между таблицами (2 варианта выше), и соединить контролы с помощью св-ва DetailControl.
События BeforeExpand у TreeViewControl нет; однако можно обратиться к win-контролу TreeView, который доступен через св-во TreeViewControl.TreeView. Это можно сделать в обработчике Form.Load:
TreeView1.TreeView.BeforeExpand += new TreeViewCancelEventHandler(this.TreeView1_BeforeExpand);
До настоящего момента я пользовалась старой версией FastRetport.Net: FastReport.Net Win+WebForms Single license 1.1 (текущая версия) 2009-08-07
И в этой версии у ListBox нет свойства DetailControl.
Поэтому я скачала новую версию FastReport.Net Win+WebForms Single license 1.3 (текущая версия) и свойство появилось.
И тут я вспомнила про проблему, на которую уже натыкалась - это подзапросы. У меня перестали работать несколько старых отчетов.
В них в коде я вручную формирую текст запроса для источника данных:
TableDataSource data = Report.GetDataSource("источник даннх") as TableDataSource;
data.SelectCommand = "текст запроса";
Проблема возникает только в тех отчетах, в которых в тексте запроса есть подзапрос. Запросы без подзапроса работают как и раньше.
Самое интересное - это то, что в мастере формирования запроса подзапросы работают...
Это мы уже, помниться, обсуждали на форуме (http://fast-report.com/ru/forum/index.php?showtopic=6693&st=0) и тогда была версия 1.1 и было наоборот - не работало в мастере и работало в коде. А после установка версии 1.2 перестало работать и так, и там.
А вот теперь в мастере работает, а в коде - нет. ))))
Я помню, что Вы мне советовали не использовать подзапросы, но мне придется переделывать кучу отчетов, на что сейчас совершенно нет времени...
Вы говорили, что в версии 1.3.4. Вы будете делать запрос схемы, только при работе в дизайнере, чтобы в при формировании в коде все работало...
Подскажите, что мне делать с моими дурацкими подзапросами...? Какие еще варианты кроме использованя ODP и не использования подзапросов??? (((((((((((((((((((((((((
Возник новый вопрос.
Все просто. Есть запрос, который возвращает одно целое значение, скажем COUNT_1. Пусть оно равно COUNT_1 = 25000.
И есть компонент Text, текст которого выглядит примерно так: "Итого: [Table1.COUNT_1]". В итоге в отчете выводится надпись: "Итого: 25000".
Внимание, вопрос. )))
Как мне сделать, чтобы значение COUNT_1 выводилось в тексте с разделением разрядов?
Жду ответ. )
Используйте форматирование:
http://fast-report.com/documentation/UserM...aformatting.htm
Спасибо, я невнимательно читала мануал до этого и не видела, что в верхней части окна Форматирование можно выбрать элемент к которому применяется это форматирования))))
СПАСИБО!!!!
Новая проблема. Есть три запроса – rep_month, orders и order_percent.
rep_month (отчетный месяц) содержит поля:
- rep_month - текстовое представление месяца в формате YYYYMM
- view_rep_month - название месяца для отображения на форме (пример: Январь 2010)
orders (организации) содержит поля:
- rep_month - текстовое представление месяца в формате YYYYMM
- order_id - код организации
- order_name - название организации
order_percent (суммы по каждой организации) содержит поля:
- order_id - код организации
- order_name - название организации
- calc_sum - сумма начислений по организации
- pay_sum - сумма оплат по организации
Запросы rep_month, orders я делаю с помощью мастера, а вот запрос order_percent делаю, как обычно, по – хитрому – в мастере делаю структуру, а в коде при нажатии кнопки ОК формирую текст запроса.
TableDataSource data = Report.GetDataSource("order_percent") as TableDataSource;
data.SelectCommand = “текст запроса”;
Между запросами настроены связи:
(Главная таблица,Подчиненная таблица,Поле для связи):
(rep_month,orders,rep_month)
(orders,order_percent ,order_id)
На форме есть:
ComboBox1:
- ComboBox1.DataColumn = rep_month.VIEW_REP_MONTH;
- ComboBox1.DetailControl = CheckedListBox1;
CheckedListBox1:
- CheckedListBox1.DataColumn = order_percent.orders.ORDER_NAME;
На странице я вывожу на печать все поля из order_percent.
Когда я выбираю из ComboBox1 интересующий меня месяц, данные в CheckedListBox1 обновляются как надо.
Но при формировании страницы выводятся все строки из order_percent.
Почему не происходит фильтрация строк – должны же остаться только те организации, которые я выбрала в CheckedListBox1. Или я опять что – то делаю не так? Подскажите, пожалуйста.
Я полагаю, что все это от того, что код запроса для order_percent я формирую после того, как FastReport “отфильтровал” данные в этом запросе в соответствии с выбранными организациями в списке.
Если это так, то как же мне быть? )
Заранее спасибо, хотя бы за то, что прочитали)))))
Попробуйте после того, как сменили текст sql, вызвать метод FilterData у CheckedListBox:
TableDataSource data = Report.GetDataSource("order_percent") as TableDataSource;
data.SelectCommand = “текст запроса”;
CheckedListBox1.FilterData();
Если не поможет, буду разбираться.
Спасибо за ответ. Вроде бы заработало, но не все...
У меня как то странно фильтруются данные, возможно я что то неправильно сделала...
Вот к примеру, у меня есть организация с кодом order_id = '1'. В январе у нее было название order_name = 'name1', а в феврале название поменялось на order_name = 'name2'.
Я выбираю в списке месяцев Январь - в CheckedListBox1 отображается как положено имя 'name1', а когда выбираю Февраль - отображается 'name2'. То есть, все ОК вроде как...
После выбора месяца, я выбираю в списке эту организацию с кодом order_id = '1' и запускаю отчет на формирование. Если я выбрала Январь - отчет формируется нормально, а если Февраль - эта организация не выводится на печать...
Если переименовать в БД эту организацию в order_name = 'name1', то работает... Что я не учла?
Но вот что интересно - если в CheckedListBox вместо имени выводить код организации - order_id и выбирать order_id = '1', то какой бы месяц я не выбрала - все формируется правильно...
Я решила, что, возможно, где то учитывается имя организации при фильтрации, что, в принципе, очень странно. Тогда я не стала формировать запрос в коде и забила в мастере вот такой простой запрос:
select '1' as order_id, 'name3, отличается и от name2, и от name1' as order_name, 100 as calc_sum, 100 as pay_sum
from dual
То есть просто забила значения полей в мастере. Код формирования запроса из кода убрала. И при выборе организации даже по имени(!!!) всегда выводится эта строка, хотя поле order_name я умышленно взяла вообще отличным и от name1, и от name2...
Короче, я уже сама запуталась...
Что - то я уже не соображаю как это все работает, объясните, пожалуйста...
Спасибо...
Неожиданный конец архива...
Я пользуюсь Firefox-ом... Странно...
Отправьте, пожалуйста, на ...@gmail.com.
Спасибо большое, буду разбираться)