LordConst |
Отправлено: 25.01.2007, 11:27 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 10
|
"Выбрать все" и "Инвентировать выбор"
перерыл все функции и хелп ниче не вышло мож кто уже делал такое подскажите как
|
|
AVC |
Отправлено: 25.01.2007, 12:01 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Ну конечно делалось, а как же иначе
Реализация зависит от того как вы предпологаете печать записи, но поработать руками придется в любом случае.
Могу предложить следующие способы
- использовать 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());
но вот как пометить все записи как выбранные???
не могу понять
Отредактировано 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() |
не конечно можно только одно но
ну не нашел я свойства типа 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
|
Народ, ау. Вы все еще путаете суп с мухами.
Писано сто раз.
Сетка — это инструмент ПОКАЗА (отображения) данных на экране. А двигаться и помечать нужно сами данные. И ни какие наследники от сетки не помогут.
Стандартная сетка оперирует Bookmark'ами. Как с ними работать есть в хелпе, но с моей точки зрения это самый самый неудачный способ ибо Bookmark это конкатенация строкового представления всех полей записи. |
|
LordConst |
Отправлено: 25.01.2007, 16:18 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 10
|
Ну то что двигаться по датасету ясный пень тока вот какой признак ставить строчке что бы в гриде она была помеченна как выбранная?
|
|
LordConst |
Отправлено: 25.01.2007, 16:32 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 10
|
Ладно всем спасибо кто пытался помочь
Вот то что у меня получилось вроде работает.
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 строчкой
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;
}
| |
|