2.2.6.17.77 GridControl::SetCellComboList


Description

Sets the editor to be used when editing a cell.

Syntax

void SetCellComboList( int nRow, int nCol, LPCSTR lpcszComboList )

Parameters

nRow
[input] 0-offset row index
nCol
[input] 0-offset column index
lpcszComboList
[input] empty string or "..." to display a button; a string separated by "|" to display a drop-down list

Return

Examples

The examples in this section will use an existing grid dialog resource DLL that gets installed with Origin C's Developer Kit. The DLL can be found in this zip file, under \Dialog Builder\GridDLG sub-folder.

#include <..\Originlab\DialogEx.h>
#include "GridDLGRes.h"// resource DLL header

enum{
	GRID_COUNTRY_COL = 0,
	GRID_CITY_COL,
	GRID_FLOWER_COL,
	GRID_SHIP_COL,
	GRID_ADDRESS_COL
};

#define THE_COUNTRY_LIST		"AUSTRALIA|CANADA|CHINA|JAPAN|UK|USA"
#define AUSTRALIA_CITY_LIST 	"Melbourne|Perth|Sydney"
#define CANADA_CITY_LIST 		"Montreal|Ottawa|Toronto|Vancouver"
#define CHINA_CITY_LIST 		"Beijing|Guangzhou|Shanghai|Shenzhen"
#define JAPAN_CITY_LIST 		"Nagoya|Osaka|Sapporo|Tokyo|Yokohama"
#define UK_CITY_LIST 			"Birmingham|Liverpool|London|Manchester"
#define USA_CITY_LIST 			"Boston|Chicago|Los Angeles|New York|San Francisco"


class GridCtrlDLG : public ResizeDialog
{
public:
	GridCtrlDLG() : ResizeDialog(IDD_GRID_DLG, "GridDLG")
	{
	}

	int DoModal(HWND hParent = NULL)
	{
		InitMsgMap();
		int nRet = ResizeDialog::DoModal(hParent);
		return nRet;
	}

protected:
///----------------- Message Map ----------------
	EVENTS_BEGIN
		ON_INIT(OnInitDialog)
		ON_SIZE(OnDlgResize)
		ON_GETMINMAXINFO(OnMinMaxInfo)
		ON_GRID_AFTER_EDIT(IDC_GRID, OnGridComboChange)
		ON_GRID_BUTTON_CLICK(IDC_GRID, OnGridButtonClick)
		ON_OK(OnOK)
	EVENTS_END
///----------------------------------------------
	
	BOOL OnInitDialog()
	{
		ResizeDialog::OnInitDialog(0, "Grid Dialog");
		
		initGrid();
		
		fitDlgWidthtoGrid();
		
		SetInitReady();
		return TRUE;
	}	

	BOOL OnDlgResize(int nType, int cx, int cy)
	{
		if(!IsInitReady())
			return TRUE;		
		
		uint nButtonIDs[] = {IDOK, 0};
		ArrangeMainItemAndControls(nButtonIDs, IDC_GRID, NULL, false);
		return TRUE;
		
	}
	
	void OnGridComboChange(Control flxControl, int nRow, int nCol)
	{
		if(GRID_COUNTRY_COL == nCol)
		{
			string strCountry = m_GridCtrl.GetCell(nRow, nCol);
			string strCountryList = THE_COUNTRY_LIST;
			string strCityList;
			
			int nCountry = strCountryList.FindToken(strCountry, ITEM_SEPARATOR);
			switch(nCountry)
			{
			case 0:
				strCityList = AUSTRALIA_CITY_LIST;
				break;
			case 1:
				strCityList = CANADA_CITY_LIST;
				break;
			case 2:
				strCityList = CHINA_CITY_LIST;
				break;
			case 3:
				strCityList = JAPAN_CITY_LIST;
				break;
			case 4:
				strCityList = UK_CITY_LIST;
				break;
			case 5:
				strCityList = USA_CITY_LIST;
				break;
			default:
				return;
			}
			m_GridCtrl.SetCellComboList(nRow, GRID_CITY_COL, strCityList);
			
			string strCity = m_GridCtrl.GetCell(nRow, GRID_CITY_COL);
			if(strCityList.FindToken(strCity, ITEM_SEPARATOR) < 0)
			{
				strCity = strCityList.GetToken(0, ITEM_SEPARATOR);
				m_GridCtrl.SetCell(nRow, GRID_CITY_COL, strCity);
			}
		}
	}
	
	void OnGridButtonClick(Control flxControl, int nRow, int nCol)
	{
		if(GRID_FLOWER_COL == nCol)
		{
			RECT rect;
			m_GridCtrl.GetCellRect(nRow, nCol, rect, true, true);
			
			Menu menuFlower;
			int nCmd = 1;
			menuFlower.Add("Iris", nCmd++, MF_STRING);
			menuFlower.Add("Jasmine", nCmd++, MF_STRING);
			menuFlower.Add("Lily", nCmd++, MF_STRING);
			menuFlower.Add("Peony", nCmd++, MF_STRING);
			menuFlower.Add("Rose", nCmd++, MF_STRING);
			
			nCmd = 0;
			menuFlower.TrackPopupMenu(0, rect.right, rect.top, GetSafeHwnd(), &nCmd);
			if(nCmd)
			{
				string strFlower;
				menuFlower.GetMenuString(nCmd, strFlower, MF_BYCOMMAND);
				m_GridCtrl.SetCell(nRow, nCol, strFlower);
			}
		}
	}
	
	BOOL OnOK()
	{
		int nFlag = 0;
		for(int ii = m_GridCtrl.GetRowOffset(); ii < m_GridCtrl.GetRows(); ii++)
		{
			vector<string> vsValues;
			m_GridCtrl.GetRowValues(ii, vsValues);
			string strCheck = str_combine(vsValues, "");
			strCheck.TrimRight();
			if( strCheck.IsEmpty() )
				continue;
			
			if( !nFlag )
			{
				nFlag++;
				
				vector<string> vsTitles;
				m_GridCtrl.GetRowValues(0, vsTitles);
				out_str( str_combine(vsTitles, "\t") );
			}
			
			out_str( str_combine(vsValues, "\t") );
		}
		return TRUE;
	}
	
private:
	void initGrid()
	{
		m_GridCtrl.Init(IDC_GRID, *this);
		m_GridCtrl.SetupRowsCols( 1, 0, 5, 1 );
		m_GridCtrl.SetColHeader("Country|City|Flower|Ship|Address");
		m_GridCtrl.SetColWidth(GRID_COUNTRY_COL, 1500);
		m_GridCtrl.SetColWidth(GRID_CITY_COL, 1500);	
		m_GridCtrl.SetColWidth(GRID_FLOWER_COL, 1500);
		m_GridCtrl.SetColWidth(GRID_SHIP_COL, 450);
		m_GridCtrl.SetColWidth(GRID_ADDRESS_COL, 2000);
		
		//move grid control to top left
		RECT rrList;	
		rrList.top = rrList.left = GetControlGap();
		m_GridCtrl.MoveWindow(rrList);
		
		m_GridCtrl.SetColComboList(GRID_COUNTRY_COL, THE_COUNTRY_LIST);
		
		m_GridCtrl.SetColComboList(GRID_FLOWER_COL, "|...");
		HINSTANCE hInst = NULL;
		int nResId = OBM_RGARROW;
		HBITMAP hBmp = LoadBitmap(hInst, (LPCSTR)nResId);
		PictureHolder pict;
		if(pict.CreateFromBitmap(hBmp, TRUE))
			m_GridCtrl.SetColDotButtonIcon(GRID_FLOWER_COL, pict);
		
		m_GridCtrl.SetColDataType(GRID_SHIP_COL, flexDTBoolean);
		m_GridCtrl.SetColAlignment(GRID_SHIP_COL, flexAlignCenterCenter);
	}
	
	int getColsWidth()
	{
		int nTotal;
		for(int nCol = m_GridCtrl.GetCols()-1; nCol >= 0; nCol--)
		{
			nTotal += m_GridCtrl.TwipsToPixels( m_GridCtrl.GetColWidth(nCol) );
		}
		return nTotal;
	}
	
	void fitDlgWidthtoGrid()
	{
		RECT rrDlg;
		m_wndDlg.GetWindowRect(&rrDlg);
		rrDlg.right = rrDlg.left + getColsWidth() + GetControlGap() * 2 + 100;		
		DisableOnSize(true);				
		m_wndDlg.MoveWindow(&rrDlg);
		DisableOnSize(false);
	}

private:
	GridControl         m_GridCtrl;
};

bool OpenGridDLG()    
{
	GridCtrlDLG myDlg;
	myDlg.DoModal( GetWindow() );
	return true;
}

Remark

See Also

GridControl::SetColComboList

Header to Included

GridControl.h