CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Dodawanie kolumn do DBGrid w locie
Strona 1 z 1

Dodawanie kolumn do DBGrid w locie

Nowy postNapisane: środa, 14 sierpnia 2013, 13:15
przez g00se
Witam,

Problem jest chyba dość błahy. Otóż poprzez procedurę składowaną pobieram dane z bazy i wyświetlam wynik w DBGridzie. Działa. Natomiast w trakcie działania programu muszę dodać dynamicznie kolumny do tego DBGrida ale nie bardzo wiem jak. Do dodania nowego pola TField używam składni:

KOD cpp:     UKRYJ  
TFloatField *field = new TFloatField(JvDBGrid1->Owner);
field->Name = NewFieldName;

JvDBGrid1->DataSource->DataSet->Fields->Add(field)


Parametr FieldList->Count komponentu JvDBGrid1 faktycznie się zwiększa po dodaniu, ale nie widać tych zmian na formatce. I to jest problem na etapie dodania nowej kolumny do DBGrida. Nie chcę na tym etapie zapisywać danych do bazy ale wyłącznie przedstawić je na interfejse.

Jeśli dodam kolumnę poprzez JvDBGrid1->Columns->Add() to kolumna się dodaje, ale dane pobrane z bazy znikają...

Jak poprawnie zabrać się za taką operację?

Re: Dodawanie kolumn do DBGrid w locie

Nowy postNapisane: środa, 14 sierpnia 2013, 13:25
przez Mironas
Może wystarczy przeładować tabelę (zamknąć i ponownie otworzyć) po JvDBGrid1->Columns->Add()

Re: Dodawanie kolumn do DBGrid w locie

Nowy postNapisane: środa, 14 sierpnia 2013, 13:29
przez g00se
Niestety, kolumny się dodają ale wynik z procedury znika...

Re: Dodawanie kolumn do DBGrid w locie

Nowy postNapisane: środa, 14 sierpnia 2013, 14:00
przez Mironas
Jak rozumiem w DataSet masz już tą kolumnę, tylko chcesz ją pokazać w DBGrid.
Zakładając, że pole bazy danych nazywa się "LICZBA" zrób to tak:
KOD cpp:     UKRYJ  
void __fastcall TForm1::btnDodajKolumneClick(TObject *Sender)
{
  TColumn* kolumna = DBGrid1->Columns->Add();
  kolumna->FieldName = "LICZBA";
  btnDodajKolumne->Enabled = false;
}
 

Re: Dodawanie kolumn do DBGrid w locie

Nowy postNapisane: środa, 14 sierpnia 2013, 15:06
przez g00se
Sprawdzę jutro te rozwiązanie ale poradziłem sobie w inny sposób :) Mam jeszcze pytanie odnośnie edytowania danych w DBGridzie (i pochodnych). Dlaczego, gdy pobiorę dane przez procedurę skladowaną, nie mogę zmieniać danych w gridzie? jak go skonfigurować aby dało się edytować wartości? Trzeba najpierw wszystkie pobrane pola (TFields) ustawiać na konkretny typ? Np. TFloatField? Brak mi pomysłów... Korzystam też z komponentów TADODataSet -> TDataSource -> DBGrid/JvDBGrid

Re: Dodawanie kolumn do DBGrid w locie

Nowy postNapisane: środa, 14 sierpnia 2013, 15:29
przez Corvis
Po 1 - włączyć możliwość edycji w TDBGrid :) w opcjach masz goEdit albo goEdditing, z głowy nie pamiętam

Re: Dodawanie kolumn do DBGrid w locie

Nowy postNapisane: środa, 14 sierpnia 2013, 15:39
przez Mironas
g00se napisał(a):Dlaczego, gdy pobiorę dane przez procedurę skladowaną, nie mogę zmieniać danych w gridzie?

Nie sprawdzałem, ale chyba nie da się edytować w DBGrid danych pobranych przez procedurę składowaną. Procedura wykonuje się po stronie serwera i od strony klienta można ją co najwyżej wywołać. Edycja danych w DBGrid generuje dużą transmisję klient-serwer, a procedury składowane są po to aby ograniczać taką transmisję.
Jednak jak pisałem nie bawiłem się tym więc nie mam pewności.

Re: Dodawanie kolumn do DBGrid w locie

Nowy postNapisane: środa, 14 sierpnia 2013, 15:54
przez g00se
Tak, wiem. Chodzi o to aby dane wyświetlić, zrobić locka na pobrane dane i edytować dataset bez informacji zwrotnej. Informacja zwrotna pójdzie po zatwierdzeniu inna procedura.

Re: Dodawanie kolumn do DBGrid w locie

Nowy postNapisane: czwartek, 15 sierpnia 2013, 11:12
przez Corvis
Poco sobie tak życie utrudniać ? :) Czy edytowanie danych z poziomu TDBGrid-a jest naprawdę takie fajne ?? ( chyba, że takie są twarde wymagania ) Mi to się nie podoba - mało czytelny sposób. Osobiście wizualizuję tylko dane w TDBGrid-zie, całe zarządzanie mam po kliknięciu w odpowiedni rekord i otwarciu formularza do zarządzania danymi. Wtedy mam nad wszystkim pełną kontrolę.

Re: Dodawanie kolumn do DBGrid w locie

Nowy postNapisane: piątek, 16 sierpnia 2013, 06:34
przez g00se
Teoretycznie masz racje. Ale w tym wypadku łatwiej oraz czytelniej będzie edytować dane w DBGridzie. Macie jakieś rozwiazanie? Do głowy przychodzi mi jedynie napisanie metody ToArray() i zasilenie StringGrida... Ale nie wiem czy to będzie taki optymalne...

Re: Dodawanie kolumn do DBGrid w locie

Nowy postNapisane: piątek, 16 sierpnia 2013, 10:31
przez Mironas
Albo samodzielnie przepisuj dane do StringGrid-a i tam je edytuj. Masz wtedy pełną kontrolę nad tym co dzieje Ci się w tabelce.

Re: Dodawanie kolumn do DBGrid w locie

Nowy postNapisane: niedziela, 18 sierpnia 2013, 13:26
przez Corvis
Też jest pomysł.