Работа с компонентами

ListopadListopad Хабаровск
отредактировано 10:24 Раздел: FastReport .NET
Как очистить DataSelector?
К примеру, я выбрала какие то строки и они появились в правой части DataSelector'а.
Как мне их оттуда удалить? Каким методом?
«1

Комментарии

  • отредактировано July 2009
    Кнопочками - их в DataSelector 4. Метода не предусмотрено.
  • ListopadListopad Хабаровск
    отредактировано 10:24
    AlexTZ написал: »
    Кнопочками - их в DataSelector 4. Метода не предусмотрено.
    Хорошо, спасибо, а как тогда получить список строк, которые находят в правой части (к примеру, для запроса мне необходим список выбранных значений)?
  • отредактировано 10:24
    DataSelector сам фильтрует набор данных, к которому он подключен. Вам, как правило, не надо делать ничего.
  • ListopadListopad Хабаровск
    отредактировано 10:24
    AlexTZ написал: »
    DataSelector сам фильтрует набор данных, к которому он подключен. Вам, как правило, не надо делать ничего.
    Ну а я столкнулась с ситуацией, когда мне надо получить список строк из DataSelector'а. Это, видимо, невозможно, да?
  • отредактировано 10:24
    Почему же, возможно. Если опишете задачу подробнее, возможно, подскажу более простое решение.

  • ListopadListopad Хабаровск
    отредактировано 10:24
    AlexTZ написал: »
    Почему же, возможно. Если опишете задачу подробнее, возможно, подскажу более простое решение.
    Ладно, спасибо. Хотелось бы конечно, чтобы можно было программно получить список выбранных элементов и очистить список в правой части...

    И еще: там кнопки не работают. )))
    Если к примеру выбрать один элемент, то кнопка [<] не работает. Да и вообще они работют странно. Если переместить все элементы списка в правую часть и обратно, то кнопка [>] неактивна...
  • отредактировано 10:24
    Кнопки поправил.
  • ListopadListopad Хабаровск
    отредактировано 10:24
    AlexTZ написал: »
    Кнопки поправил.
    Здорово. И в какой версии они будут работать нормально?
  • отредактировано 10:24
    В текущей - можете качать.
  • ListopadListopad Хабаровск
    отредактировано 10:24
    AlexTZ написал: »
    В текущей - можете качать.

    Здорово, как все оперативно. ) Спасибо вам. )))
  • ListopadListopad Хабаровск
    отредактировано 10:24
    Здравствуйте!

    У меня два вопроса по поводу 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(); Не работает.
    Подскажите, пожалуйста, что я делаю не так и как мне реализовать поставленную задачу?

    Жду Ваш ответ.
  • ListopadListopad Хабаровск
    отредактировано 10:24
    И еще один вопрос. По поводу TreeView.
    Подскажите, пожалуйста, как мне обратотать событие раскрытия списка для узла дерева?
  • отредактировано February 2010
    Здравствуйте,

    Это так называемая каскадная фильтрация, краткое описание здесь:
    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.
  • отредактировано 10:24
    По поводу Tree:
    События BeforeExpand у TreeViewControl нет; однако можно обратиться к win-контролу TreeView, который доступен через св-во TreeViewControl.TreeView. Это можно сделать в обработчике Form.Load:

    TreeView1.TreeView.BeforeExpand += new TreeViewCancelEventHandler(this.TreeView1_BeforeExpand);
  • ListopadListopad Хабаровск
    отредактировано 10:24
    Здравствуйте, большое спасибо за Ваш ответ.

    До настоящего момента я пользовалась старой версией 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 и не использования подзапросов??? (((((((((((((((((((((((((
  • ListopadListopad Хабаровск
    отредактировано 10:24
    Я ошиблась, сейчас не работает ни в мастере, ни в коде...
  • отредактировано 10:24
    Попробуйте на сегодняшнем билде. В мастере работать не будет (это невозможно без ODP), в коде работать должно.
  • ListopadListopad Хабаровск
    отредактировано February 2010
    Все заработало. Спасибо большое!!!!!
  • ListopadListopad Хабаровск
    отредактировано 10:24
    Еще раз здравствуйте!

    Возник новый вопрос.
    Все просто. Есть запрос, который возвращает одно целое значение, скажем COUNT_1. Пусть оно равно COUNT_1 = 25000.
    И есть компонент Text, текст которого выглядит примерно так: "Итого: [Table1.COUNT_1]". В итоге в отчете выводится надпись: "Итого: 25000".

    Внимание, вопрос. )))
    Как мне сделать, чтобы значение COUNT_1 выводилось в тексте с разделением разрядов?

    Жду ответ. )
  • отредактировано March 2010
    Здравствуйте,

    Используйте форматирование:
    http://fast-report.com/documentation/UserM...aformatting.htm
  • ListopadListopad Хабаровск
    отредактировано 10:24
    AlexTZ написал: »
    Здравствуйте,

    Используйте форматирование:
    http://fast-report.com/documentation/UserM...aformatting.htm

    Спасибо, я невнимательно читала мануал до этого и не видела, что в верхней части окна Форматирование можно выбрать элемент к которому применяется это форматирования))))

    СПАСИБО!!!!
  • ListopadListopad Хабаровск
    отредактировано 10:24
    И снова, здравствуйте!

    Новая проблема. Есть три запроса – 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 “отфильтровал” данные в этом запросе в соответствии с выбранными организациями в списке.

    Если это так, то как же мне быть? )

    Заранее спасибо, хотя бы за то, что прочитали)))))

  • отредактировано 10:24
    Здравствуйте,

    Попробуйте после того, как сменили текст sql, вызвать метод FilterData у CheckedListBox:

    TableDataSource data = Report.GetDataSource("order_percent") as TableDataSource;
    data.SelectCommand = “текст запроса”;
    CheckedListBox1.FilterData();

    Если не поможет, буду разбираться.
  • ListopadListopad Хабаровск
    отредактировано 10:24
    AlexTZ написал: »
    Здравствуйте,

    Попробуйте после того, как сменили текст 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...

    Короче, я уже сама запуталась...

    Что - то я уже не соображаю как это все работает, объясните, пожалуйста...
    Спасибо...
  • отредактировано 10:24
    Прикрепляю пример на основе данных из демо, как сделал бы отчет я. Отчет типа master-detail-subdetail, но реально печатается только одна строка из master (та, что выбрана в комбобоксе), несколько строк из detail (выбранные в checkedlistbox), а также все относящиеся к ним строки subdetail.
  • ListopadListopad Хабаровск
    отредактировано 10:24
    AlexTZ написал: »
    Прикрепляю пример на основе данных из демо, как сделал бы отчет я. Отчет типа master-detail-subdetail, но реально печатается только одна строка из master (та, что выбрана в комбобоксе), несколько строк из detail (выбранные в checkedlistbox), а также все относящиеся к ним строки subdetail.

    Неожиданный конец архива...
  • отредактировано March 2010
    За форумом замечено, что архивы не открываются, если смотреть их в Internet Explorer. В Firefox все работает. Если нет Firefox - скажите, куда отослать письмо с архивом.
  • ListopadListopad Хабаровск
    отредактировано March 2010
    AlexTZ написал: »
    За форумом замечено, что архивы не открываются, если смотреть их в Internet Explorer. В Firefox все работает. Если нет Firefox - скажите, куда отослать письмо с архивом.

    Я пользуюсь Firefox-ом... Странно...
    Отправьте, пожалуйста, на ...@gmail.com.
  • отредактировано 10:24
    Отправил.
  • ListopadListopad Хабаровск
    отредактировано 10:24
    AlexTZ написал: »
    Отправил.

    Спасибо большое, буду разбираться)

Оставить комментарий

Многофункциональный текстовый редактор. Чтобы отредактировать стиль параграфа, нажмите TAB, чтобы перейти к меню абзаца. Там вы можете выбрать стиль. По умолчанию не выбран ни один стиль. Когда вы выберете текст, появится встроенное меню форматирования. Нажмите TAB, чтобы войти в него. Некоторые элементы, такие как многофункциональные вставки ссылок, картинок, индикаторов загрузки и сообщений об ошибок могут быть вставлены в редактор. Вы можете перемещаться по ним, используя стрелки внутри редактора и удалять с помощью клавиш delete или backspace.