Tworzenie obiektowego UI w OE Development Studio cz. III

W poprzedniej części zbudowaliśmy aplikację składającą się z dwóch okienek (form) z browserami danych z bazy OpenEdge. Wszystkie te dane są do odczytu; ich edycję omówimy niedługo, ale jeszcze nie w tym odcinku.

Na razie wracamy do ustawień, związanych z wyświetlaniem danych w DataGrid. Tych parametrów jest bardzo dużo. Omówimy tylko wybrane, zostawiając Wam pole do własnych badań.


W parametrach DatGridView formy fOrder, parametr: AutoSizeColumnsMode – ustawmy na wartość: Fill.


W oknie widzimy, że kolumny są ciasno upakowane. Ponieważ jednak to .Net i mamy odpowiednio ustawiony parametr Anchor więc po rozciągnięciu okna mamy widok:

Można te dane jeszcze bardziej ścieśnić ustawiając wartość: DisplayedCellsExceptHeader. Etykiety kolumn mogą jednak nie być wyświetlone w całości.

AutoSizeRowsMode – wpływa na automatyczne ustawienie wysokości wiersza. Przy pomocy tego parametru możemy np. wyświetlić łamane wartości pola.

Przechodzimy teraz do formy fCustomer. Dodajmy do DataGrid pole Comments. Ustawmy AutoSizeRowsMode na wartość DisplayedCells – wysokość wiersza będzie dobrana po analizie rekordów do wyświetlenia. Możemy ustawić również wartość AllCells, ale w przypadku dużej liczby rekordów analiza może trwać o wiele dłużej.


Wchodzimy do edytora kolumn: Zadania DataGridView -> Edytuj kolumny… (edytor jest także dostępny pod widokiem z właściwościami).

Zaznaczamy pole Comments. W sekcji Wygląd wybieramy parametr DefaultCellStyle: DataGridViewCellStyle …

Ustawmy WrapMode na True oraz jakiś kolor tła – parametr BackColor.

Pole Comments jest już wyświetlane z zawijaniem wierszy.

A teraz pokażemy jak dodać dodatkowe pole do wyświetlenia w DataGrid, którego nie ma w bazie danych, a które bazuje na wartościach innych pól; w Progress ABL było ono znane jako calculated field.
Ponownie wchodzimy do Zadania DataGridView, ale tym razem klikamy Dodaj kolumnę…
Dodatkowa kolumna będzie zawierać sklejone wartości pól City i Country. Zaznaczamy opcję Kolumna niezwiązana z danymi i wypełniamy jak na rysunku poniżej.

Klikamy Dodaj.
W edytorze kolumn ustawiamy nową kolumnę CityCountry zaraz za polem Country.

Na razie w nowym polu nie ma żadnych danych.

Musimy teraz włączyć tryb wirtualny (VirtualMode) – wskazuje on czy podano własne operacje zarządzania danymi dla DataGridView.
Teraz trzeba włączyć obsługę odpowiedniego zdarzenia. Wg Wiesława można to zrobić na kilka sposobów, jednakże dobrym wyborem, ze względu na wydajność, jest zdarzenie CellValueNeeded. Jest ono wywoływane tylko gdy wartość komórki jest potrzebna np. do wyświetlenia czy przekazania wartości.

W kodzie zostaje wstawiona metoda obsługująca to zdarzenie. Poprzez parametr e mamy dostęp do argumentów zdarzenia.
W kodzie metody dodajemy prosty kod, dla przetestowania, czy idziemy właściwą drogą: e:Value = “OK”.

METHOD PRIVATE VOID dataGridView1_CellValueNeeded( INPUT sender AS System.Object, INPUT e AS System.Windows.Forms.DataGridViewCellValueEventArgs ):
       e:Value = "OK".
       RETURN.
END METHOD.

Na razie wszystko idzie zgodnie z planem.

Musimy teraz znaleźć nazwy obu kolumn w DataGridView, które zawierają dane dla City i Country.

METHOD PRIVATE VOID dataGridView1_CellValueNeeded( INPUT sender AS System.Object, INPUT e AS System.Windows.Forms.DataGridViewCellValueEventArgs ):
       e:Value = dataGridView1:Rows[e:RowIndex]:Cells[2]:Value:ToString() + ", " +
       dataGridView1:Rows[e:RowIndex]:Cells[3]:Value:ToString()..
       RETURN.
END METHOD.

W powyższej instrukcji wartości kolumn pochodzą z trzeciej i czwartej kolumny w gridzie (liczone 0,1,2,3…).
Zmiana kolejności kolumn w gridzie spowoduje błędne wyświetlanie w naszej dodatkowej kolumnie dlatego lepiej jest wstawienie wartości kolumn po nazwie. W deklaracji zmiennych możemy znaleźć:

DEFINE PRIVATE VARIABLE cityDataGridViewTextBoxColumn AS System.Windows.Forms.DataGridViewTextBoxColumn NO-UNDO.
.....................
DEFINE PRIVATE VARIABLE countryDataGridViewTextBoxColumn AS System.Windows.Forms.DataGridViewTextBoxColumn NO-UNDO.

Obsługę zdarzenia możemy zatem zapisać następująco:

METHOD PRIVATE VOID dataGridView1_CellValueNeeded( INPUT sender AS System.Object, INPUT e AS System.Windows.Forms.DataGridViewCellValueEventArgs ):
   e:Value = dataGridView1:Rows[e:RowIndex]:Cells["cityDataGridViewTextBoxColumn"]:Value:ToString() + ", " +
   dataGridView1:Rows[e:RowIndex]:Cells["countryDataGridViewTextBoxColumn"]:Value:ToString().
   RETURN.
END METHOD.

W nowej kolumnie dane wyglądają, tak jak to sobie zaplanowaliśmy. teraz trzeba tylko wyłączyć kolumny City i Country.

W edytorze kolumn ustawiamy wartość parametru Visible na False.

Teraz jest OK.

Dziękujemy za uwagę.

Wiesław Kurzątkowski
Piotr Tucholski