C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
DBGrid, хочу сделать кнопки
LordConst
Отправлено: 25.01.2007, 11:27


Ученик-кочегар

Группа: Участник
Сообщений: 10



"Выбрать все" и "Инвентировать выбор"

перерыл все функции и хелп ниче не вышло мож кто уже делал такое подскажите как wizard.gif
AVC
Отправлено: 25.01.2007, 12:01


Ветеран

Группа: Модератор
Сообщений: 1583



Ну конечно делалось, а как же иначе smile.gif
Реализация зависит от того как вы предпологаете печать записи, но поработать руками придется в любом случае.
Могу предложить следующие способы
- использовать Bookmark: легче всего но очень неэкономно и не надежно
- использовать массив PK: самое то
- использовать дополнительное поле в таблице
- использовать дополнительную таблицу
- комбинации этих методов
- то что вы придумаете сами.
LordConst
Отправлено: 25.01.2007, 12:56


Ученик-кочегар

Группа: Участник
Сообщений: 10



А какой метод или свойство обозначает что строка в гриде выбрана?

Знаю что вот так
DBFileDay->SelectedRows->Clear();
можно очистить выбранные строки

список выбранных получаю так
TDataSet *pDS = DBFileDay->DataSource->DataSet;
for (int i=0; i < DBFileDay->SelectedRows->Count; i++)
pDS->GotoBookmark((void *)DBFileDay->SelectedRows->Items[i].c_str());

но вот как пометить все записи как выбранные???
не могу понять wink.gif

Отредактировано LordConst — 25.01.2007, 12:59
nawok78
Отправлено: 25.01.2007, 14:25


Станционный диспетчер

Группа: Участник
Сообщений: 115



может попробовать создать класс от DBGrid
и дописать методы?
Select(int)
SelectAll()
LordConst
Отправлено: 25.01.2007, 14:59


Ученик-кочегар

Группа: Участник
Сообщений: 10



QUOTE (nawok78 @ 25.01.2007, 14:25)
может попробовать создать класс от DBGrid
и дописать методы?
Select(int)
SelectAll()

не конечно можно только одно но sad.gif
ну не нашел я свойства типа Selected у строки DBGrid
nawok78
Отправлено: 25.01.2007, 15:01


Станционный диспетчер

Группа: Участник
Сообщений: 115



DBGrid->SelectedRows
вот они то и содержат таковые
LordConst
Отправлено: 25.01.2007, 15:11


Ученик-кочегар

Группа: Участник
Сообщений: 10



QUOTE (nawok78 @ 25.01.2007, 15:01)
DBGrid->SelectedRows
вот они то и содержат таковые

Да это все выделенные записи, а теперь вопрос как сделать выделенными все кроме этих DBGrid->SelectedRows?
nawok78
Отправлено: 25.01.2007, 15:22


Станционный диспетчер

Группа: Участник
Сообщений: 115



Добавлять в список остальные
Вот только как это сделать?
поэтому и предлагаю написать класс от него....
проще будет обращаться к защищенным свойствам и процееююю
LordConst
Отправлено: 25.01.2007, 15:30


Ученик-кочегар

Группа: Участник
Сообщений: 10



Хорошо тогда вопрос еще тупее как двигаться в цикле по записям в DBgrid?
AVC
Отправлено: 25.01.2007, 15:49


Ветеран

Группа: Модератор
Сообщений: 1583



Народ, ау. Вы все еще путаете суп с мухами. smile.gif
Писано сто раз.
Сетка — это инструмент ПОКАЗА (отображения) данных на экране. А двигаться и помечать нужно сами данные. И ни какие наследники от сетки не помогут.

Стандартная сетка оперирует Bookmark'ами. Как с ними работать есть в хелпе, но с моей точки зрения это самый самый неудачный способ ибо Bookmark это конкатенация строкового представления всех полей записи.
LordConst
Отправлено: 25.01.2007, 16:18


Ученик-кочегар

Группа: Участник
Сообщений: 10



Ну то что двигаться по датасету ясный пень тока вот какой признак ставить строчке что бы в гриде она была помеченна как выбранная?
LordConst
Отправлено: 25.01.2007, 16:32


Ученик-кочегар

Группа: Участник
Сообщений: 10



Ладно всем спасибо кто пытался помочь wizard.gif
Вот то что у меня получилось вроде работает. yahoo.gif
CODE

//---------------------------------------------------------------------------

void __fastcall TTarifForm::ICheckAllClick(TObject *Sender)
{
 DBFileDay->SelectedRows->Clear();
 DSFileDay->DataSet->First();
 DSFileDay->DataSet->DisableControls();
 while (!DSFileDay->DataSet->Eof)
 {
  DBFileDay->SelectedRows->CurrentRowSelected=true;
  DSFileDay->DataSet->Next();
 }
 DSFileDay->DataSet->EnableControls();
}
//---------------------------------------------------------------------------

void __fastcall TTarifForm::ICheckInvertClick(TObject *Sender)
{
 DSFileDay->DataSet->First();
 DSFileDay->DataSet->DisableControls();
 while (!DSFileDay->DataSet->Eof)
 {
 if (DBFileDay->SelectedRows->CurrentRowSelected)
  DBFileDay->SelectedRows->CurrentRowSelected=false;
 else
  DBFileDay->SelectedRows->CurrentRowSelected=true;
  DSFileDay->DataSet->Next();
 }
 DSFileDay->DataSet->EnableControls();
}
nawok78
Отправлено: 25.01.2007, 16:55


Станционный диспетчер

Группа: Участник
Сообщений: 115



CODE

if (DBFileDay->SelectedRows->CurrentRowSelected)
 DBFileDay->SelectedRows->CurrentRowSelected=false;
else
 DBFileDay->SelectedRows->CurrentRowSelected=true;

можно заменить 1 строчкой wink.gif
CODE

DBFileDay->SelectedRows->CurrentRowSelected = !DBFileDay->SelectedRows->CurrentRowSelected;
AVC
Отправлено: 25.01.2007, 16:55


Ветеран

Группа: Модератор
Сообщений: 1583



Дабы я тоже не зря читал help
CODE

void __fastcall TForm1::Bt_SirJClick(TObject *Sender)
{
DBGrid1->DataSource = DSr_SerJ;
TDataSet *ds = DSr_SerJ->DataSet;
if (!ds->Active) ds->Active = true;

TBookmarkList *bml = DBGrid1->SelectedRows;
for (ds->First(); !ds->Eof; ds->Next()) bml->CurrentRowSelected = true;
}

Вернуться в Вопросы программирования в C++Builder