Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

DBComboBoxEh и DBGridEh

281
15 сентября 2006 года
Fan][
279 / / 19.12.2003
На форме DBComboBoxEh и DBGridEh.
При запуске формы данные из таблицы определённого столбца заносятся в Items DBComboBoxEh'а.
Стоит в DBComboBoxEh выбрать какой-нибудь Item, как он тут же отображается в самой последней пустой (кстати, как её убрать) строчке грида.
Просмотрел все события (думал может влепил когда чего) - всё чисто. Как убрать этот косяк?

И вот ещё что: через тот же DBComboBoxEh в таблицу заносятся данные. Сдела так, что бы они тут же заносились в Items'ы DBComboBoxEh'а. Они заносятся (стоит только перезапустить прогу - сразу всё на месте), но появляется в списке Items'ов только после перезапуска проги. Тут то что?
1
17 сентября 2006 года
kot_
7.3K / / 20.01.2000
[QUOTE='Fan][']
И вот ещё что: через тот же DBComboBoxEh в таблицу заносятся данные.
[/QUOTE]

[QUOTE='Fan][']На форме DBComboBoxEh и DBGridEh.
При запуске формы данные из таблицы определённого столбца заносятся в Items DBComboBoxEh'а.
Стоит в DBComboBoxEh выбрать какой-нибудь Item, как он тут же отображается в самой последней пустой (кстати, как её убрать) строчке грида.
Просмотрел все события (думал может влепил когда чего) - всё чисто. Как убрать этот косяк?
[/QUOTE]
Может чего я не понял - но судя по первой цитате - комбобох ведет себя так как ты от него хочешь - добавляет в таблицу запись. Что именно не так?
[QUOTE='Fan][']
Они заносятся (стоит только перезапустить прогу - сразу всё на месте), но появляется в списке Items'ов только после перезапуска проги. Тут то что?
[/QUOTE]
Выполняй Refresh источника данных.
281
18 сентября 2006 года
Fan][
279 / / 19.12.2003
kot_

При добавлении в таблицу данных из DBComboBoxEh:
 
Код:
if(DBComboBoxEh1->Text.Length()!=0)
{
Table1->Edit();
Table1->Append();
Table1->FieldByName("Contact”)->AsString=DBComboBoxEh1->Text;
}
 DBComboBoxEh1->Items->Add(DBComboBoxEh1->Text);


происходят странные вещи.
Новые Items в DBComboBoxEh сразу не бобавляются, только после перезапуска программы.
Новый добавленный элемент затирает последний стоящий.
В последней строке DBGridEh (которая всегда пустая) появляется выбранная в DBComboBoxEh запись.

Немного подправил. Теперь получилось вот что:
Код:
if(DBComboBoxEh1->Text.Length()!=0)
        {
                Table1->Edit();
                Table1->Append();
                Table1->FieldByName("Contact")->AsString=DBComboBoxEh1->Text;
        }
        DBComboBoxEh1->Items->Add(DBComboBoxEh1->Text);

        Table1->First();
        while(!Table1->Eof)
        {
                AnsiString Contact=Table1->FieldByName("Contact")->AsString;
                int i=Table1->RecordCount;
                if(Table1->RecNo==i-1)
                                DBComboBoxEh1->Items->Add(Contact);

                Table1->Next();
        }


Вроде теперь в DBComboBoxEh item'ы появляются сразу, но только через пробел. После рестарта проги пустые item'ы пропадают.
А с DBGridEh ничего так и не получается.
1
18 сентября 2006 года
kot_
7.3K / / 20.01.2000
[QUOTE='Fan][']kot_

При добавлении в таблицу данных из DBComboBoxEh:
 
Код:
if(DBComboBoxEh1->Text.Length()!=0)
{
Table1->Edit();
Table1->Append();
Table1->FieldByName("Contact”)->AsString=DBComboBoxEh1->Text;
}
 DBComboBoxEh1->Items->Add(DBComboBoxEh1->Text);


происходят странные вещи.
Новые Items в DBComboBoxEh сразу не бобавляются, только после перезапуска программы.
Новый добавленный элемент затирает последний стоящий.
В последней строке DBGridEh (которая всегда пустая) появляется выбранная в DBComboBoxEh запись.

Немного подправил. Теперь получилось вот что:
Код:
if(DBComboBoxEh1->Text.Length()!=0)
        {
                Table1->Edit();
                Table1->Append();
                Table1->FieldByName("Contact")->AsString=DBComboBoxEh1->Text;
        }
        DBComboBoxEh1->Items->Add(DBComboBoxEh1->Text);

        Table1->First();
        while(!Table1->Eof)
        {
                AnsiString Contact=Table1->FieldByName("Contact")->AsString;
                int i=Table1->RecordCount;
                if(Table1->RecNo==i-1)
                                DBComboBoxEh1->Items->Add(Contact);

                Table1->Next();
        }


Вроде теперь в DBComboBoxEh item'ы появляются сразу, но только через пробел. После рестарта проги пустые item'ы пропадают.
А с DBGridEh ничего так и не получается.[/QUOTE]

Хм. Не очень понятно зачем такие сложности.
Почему нельзя так:
 
Код:
if(DBComboBoxEh1->Text.Length()!=0)
        {
            Table1->Edit();
            Table1->Append();
            Table1->FieldByName("Contact")->AsString=DBComboBoxEh1->Text;
            Table1->Post();
            Table1->Last();//На всякий случай :)
             DBComboBoxEh1->Items->Add(Table1->FieldByName("Contact")->AsString);
       }

Я могу конечно ошибаться, компоненты типа ТTable я вобще практически не использую, но результат должен быть тот что ты хочешь.
10
18 сентября 2006 года
Freeman
3.2K / / 06.03.2004
[QUOTE='Fan]
происходят странные вещи.
Новые Items в DBComboBoxEh сразу не бобавляются, только после перезапуска программы.
Новый добавленный элемент затирает последний стоящий.
В последней строке DBGridEh (которая всегда пустая) появляется выбранная в DBComboBoxEh запись.[/QUOTE]
Насколько я понял из бормотания, стоит примерно следующая задача:
  • в гриде отображается нечто прикладное
  • при помощи комбинированного списка должна делаться то ли подстановка, то ли фильтрация данных грида
  • список подстановки/фильтрации редактируется по ходу пьесы
  • изменения должны отображаться без повторного открытия окна
Мое подозрение о "неправильном" поведении грида строится на том, что они с DBComboBoxEh имеют общий DataSource. Соответственно, ничего странного в их поведении нет.

Решение задачи следующее:
  • Если требуется подстановка значений, выкидываем DBComboBoxEh, вместо этого создаем lookup-поля в таблице - они автоматом станут комбинированными списками в гриде. Для редактирования справочника лепим на место DBComboBoxEh кнопку, вызывающую окно редактирования справочника (окно создаем отдельно).
  • Если требуется фильтрация, заменяем DBComboBoxEh на DBLookupComboBoxEh. DataSource и DataField оставляем пустыми, вместо этого устанавливаем значения ListSource, KeyFields и ListFields. Сама фильтрация делается или через MasterSource/MasterField (если поддерживается - не помню) или ручной установкой фильтра и/или параметров запроса для набора данных в гриде и его обновлением. Обработчик для изменения фильтра вешается на AfterScroll набора данных справочника.
1
18 сентября 2006 года
kot_
7.3K / / 20.01.2000
[QUOTE=Freeman]Насколько я понял из бормотания, стоит примерно следующая задача:
  • в гриде отображается нечто прикладное
  • при помощи комбинированного списка должна делаться то ли подстановка, то ли фильтрация данных грида
Мое подозрение о "неправильном" поведении грида строится на том, что они с DBComboBoxEh имеют общий DataSource. Соответственно, ничего странного в их поведении нет.
...
[/QUOTE]
Мне честно говоря вобще трудно представить задачу, которую можно решать таким способом :) Зачем поле фильтра добавлять в таблицу? Если это подстановка - то почему запись добавляется а не обновляется? Если это попытка добавлять данные в справочник - тогда почему нет проверки на уникальность? Ну и так далее. Может это попытка сделать типа MRU? Хз.
Но то что у них общий датасет - думаю догадка 100%. По крайней мере я исходил из этого.
10
18 сентября 2006 года
Freeman
3.2K / / 06.03.2004
[QUOTE=kot_]Зачем поле фильтра добавлять в таблицу? Если это подстановка - то почему запись добавляется а не обновляется? Если это попытка добавлять данные в справочник - тогда почему нет проверки на уникальность? Ну и так далее.[/QUOTE]
А зачем ставить общий DataSource? По-моему, это все объясняет.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог