Click here to Skip to main content
Click here to Skip to main content

A WTL Grid

, 22 Jan 2002
Rate this:
Please Sign up or sign in to vote.
A WTL grid (really).

Sample Image - WtlGrid.gif

Introduction

After using WTL for some time, I've developed the control that I miss the most for the kind of project that I do : A grid.
This one is written from scratch, derived from a CScrollWindowImpl, it has the following features :

  • Grid is a vector of vector of CString.
  • It has a optional Toolbar where to add buttons with tooltip for edition operation (see screenshot).
  • Resizable column title
  • In place edit using a edit box, a combo box or a check-box.
  • Collapsible tree like behavior.
  • Overwritable behavior (BeforeEdit, AfterEdit, CellRendering, etc) via a derivable listener class.
Using it should be pretty straightforward:
#include <span class="code-string">"WtlGrid.h"
</span>

    WtlGridWrapper      grid;  
    grid.Create(*this,rcDefault,NULL,WS_CHILD|WS_VISIBLE);
    grid.construct();                 //setup
    grid.listener(new LevelListener); //add a listener to overwrite some behavior
    grid.vertical_delimiter(true);  //show vertical lines
    grid.horizontal_delimiter(true);
    grid.column_header(true); //show header
    grid.toolbar(); //show toolbar
    grid.m_toolbar.AddButton(IDB_NEW,true,"New"); //resource ID and tooltip
    grid.m_toolbar.AddButton(IDB_DELETE,false,"Delete");
    grid.m_toolbar.AddButton(IDB_UP,true,"Up");
    grid.m_toolbar.AddButton(IDB_DOWN,true,"Down");
    grid.m_toolbar.AddButton(IDB_TOP,true,"Top");
    grid.m_toolbar.AddButton(IDB_BOTTOM,true,"Bottom");
    grid.m_toolbar.enable_button(1,false);
    grid.header_height(25);
    grid.selection_mode();
    //now add the columns (header,width,alignment,Resource 
    // ID,render mode,edit mode,can grow, can be selected)
    grid.add_column("Name",-1,WtlDC::left,-1,
                    WtlGridCell::rstring,WtlGridColumn::edit,true,true);
    grid.add_column("Label",-1,WtlDC::left,-1,
                    WtlGridCell::rstring,
                    WtlGridColumn::edit,true,true);
    grid.add_column("",25,WtlDC::left,IDB_VISIBLE,
                    WtlGridCell::rcheck,
                    WtlGridColumn::check,false,
                    true,IDB_SELECTED);

   //to add rows, add a vector of cstring
  vector<CString> buf;
  buf.push_back("whatever");
  ...
  grid->add_row(buf,lev);

The inner code is also designed to be easy to understand, you'll find the following classes :

WtlGridValue

a cell value, stored as a CString.

WtlGridCell

a cell with a render mode.

WtlGridColumn

a column, with header, etc.

WtlGridColumns

a column collection, a vector of column.

WtlGridRow

a grid row, holding a vector of WtlGridCell.

WtlGridRows

a collection of rows.

WtlGrid

the control itself, containing columns and rows.

WtlGridWrapper

a wrapper control for the toolbar and the column header, this is the control that you include in your app.

Some behavior, especially the way cell are rendered and edited can be changed by overwriting a listener class, eg:

class LevelListener : public WtlGridListener 
{
 public : 
  LevelListener();

  virtual bool after_edit(WtlGrid *grid, CString &old_value, 
                          int row_nb, int column_nb,void *user,bool add);
  virtual bool after_select(WtlGrid *grid,int row_nb,int column_nb,void *user);
  virtual bool toolbar_button(WtlGrid *grid,int button_nb,void *user);
  virtual bool header_select(WtlGrid *grid,int header_nb,void *user);
  virtual bool render(WtlGrid *grid,CDCHandle dc, CRect &rc,
                      WtlGridRow *row,WtlGridCell *cell,void *user);
  virtual WtlGridColumn::e_edit_mode before_edit(WtlGrid *grid,
                                                 int row_nb, int column_nb,
                                                 void *user);
};

What is missing:

  • Obviously, the grid should be bindable to a database, and do it virtually (not loading all the records in memory), this will be my next move.
  • A lot of features...
I would be grateful to get comments and enhancement to this code, enjoy ...

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

Share

About the Author

Noel Frankinet
Architect strategis
Belgium Belgium
No Biography provided

Comments and Discussions

 
Generalbug in header PinmemberRiderV30-Dec-10 6:34 
GeneralDisable context menu Pinmemberamarbabu27-Sep-06 7:30 
GeneralDO NOT WRITE YOUR CODE THIS WAY!!! Pinmembermloskot14-Jun-05 12:14 
Hi,
 
I really appreciate your (WTL GRID writer) job!
You are a real pioneer of WTL-based grids, but - forgive me - I do not understand how one can write source code this way (as WTL GRID is written).
This code should be given as an example "how to not to write a code"!!!
 
- no comments - it seems you write your code for yourself
- coding style - your code is not readable at all (bad naming convention, no spaced between function parameters, related members/functions are not put in some blocks, etc.
 
The most important is that there are no comment of your code. I do not understand what did you generate Doxygen docs for if your code is not commented?!?
As I realized this article (and the code attached) is very old, there is a newer version on your Web Site, but you've not mentioned about the new version in this article.
 
I know it os Open Source software, you make a big contribution to the Open Source community and developers but your code seems to be usable at all
if developer does not no how to use it. Developer is forced to read and analize your code very carefully but shouldn't. Please, try to feel as you read WTL Grid code for a first time.
Open Source software is ALWAYS well documented and commented.
When you write Open Source write it well or do not publish it at all.
Open Source software should provide as good quality of code.
Simply, I do not understand why CodeProject published it in this poorstate.
 
I'm not going to attack you. I'm not at all.
 
Best regards
 


 
mloskot
GeneralRe: DO NOT WRITE YOUR CODE THIS WAY!!! PinmemberNoel Frankinet14-Jun-05 21:29 
GeneralRe: DO NOT WRITE YOUR CODE THIS WAY!!! Pinmembermloskot15-Jun-05 12:51 
GeneralI wanna to put together cells Pinsussi4uman14-Apr-05 20:43 
GeneralPretty code... Pinmembervolmax24-Feb-04 1:57 
General&amp;#65311;&amp;#65311;&amp;#65311; Collapsible tree like behavior. Pinmembernewkey6-Feb-04 20:56 
Generalthis needs work PinmemberEugene Polonsky26-Oct-02 18:41 
GeneralRe: this needs work Pinmemberroel_v6-Mar-03 0:41 
GeneralRe: this needs work Pinmembermloskot14-Jun-05 7:41 
Generalhi ,test PinmemberDeXian2-Jun-02 17:34 
GeneralRe: hi ,test Pinmemberkamal_upreti17-Feb-03 20:09 
GeneralExample source PinmemberKeith Holme29-May-02 2:39 
QuestionWM_MOUSEWHEEL ?? PinmemberDonghun Lee25-Feb-02 18:40 
QuestionAnd how do I get it to show up in a dialog? PinmemberNMTop4011-Feb-02 1:23 
GeneralAnd some major issues PinmemberNMTop407-Feb-02 3:21 
GeneralRe: And some major issues PinmemberNoel Frankinet7-Feb-02 3:37 
GeneralRe: And some major issues PinmemberNMTop407-Feb-02 6:03 
GeneralRe: some major issues in thinking Pinsusssixth_voice1-Oct-03 3:42 
GeneralRe: some major issues in thinking PinmemberMoonlightM27-May-04 3:52 
GeneralA few suggested modifications Pinmemberanonymous26-Feb-02 1:36 
GeneralRe: A few suggested modifications PinsussJusticeMonger31-Oct-03 3:38 
GeneralRedraw problem with example PinmemberRaj_Sidhu1-Feb-02 4:16 
GeneralRe: Redraw problem with example PinmemberNMTop4011-Feb-02 3:25 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web03 | 2.8.140827.1 | Last Updated 23 Jan 2002
Article Copyright 2001 by Noel Frankinet
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid