3 The {@link Ext.grid.Panel Grid Panel} is one of the centerpieces of Ext JS. It's an incredibly versatile component that provides an easy way to display, sort, group, and edit data.
7 {@img simple_grid.png Simple Grid}
9 Let's get started by creating a basic {@link Ext.grid.Panel Grid Panel} . Here's all you need to know to get a simple grid up and running:
13 A {@link Ext.grid.Panel Grid Panel} is simply a component that displays data contained in a {@link Ext.data.Store Store}. A {@link Ext.data.Store Store} can be thought of as a collection of records, or {@link Ext.data.Model Model} instances. For more information on {@link Ext.data.Store Store}s and {@link Ext.data.Model Model}s see the [Data guide](#/guide/data). The benefit of this setup is clear separation of concerns. The {@link Ext.grid.Panel Grid Panel} is only concerned with displaying the data, while the {@link Ext.data.Store Store} takes care of fetching and saving the data using its {@link Ext.data.proxy.Proxy Proxy}.
15 First we need to define a {@link Ext.data.Model Model}. A {@link Ext.data.Model Model} is just a collection of fields that represents a type of data. Let's define a model that represents a "User":
18 extend: 'Ext.data.Model',
19 fields: [ 'name', 'email', 'phone' ]
22 Next let's create a {@link Ext.data.Store Store} that contains several `User` instances.
24 var userStore = Ext.create('Ext.data.Store', {
27 { name: 'Lisa', email: 'lisa@simpsons.com', phone: '555-111-1224' },
28 { name: 'Bart', email: 'bart@simpsons.com', phone: '555-222-1234' },
29 { name: 'Homer', email: 'home@simpsons.com', phone: '555-222-1244' },
30 { name: 'Marge', email: 'marge@simpsons.com', phone: '555-222-1254' }
34 For sake of ease we configured the {@link Ext.data.Store Store} to load its data inline. In a real world application you'll usually configure the {@link Ext.data.Store Store} to use a {@link Ext.data.Proxy Proxy} to load data from the server. See the [Data guide](#/guide/data) for more on using {@link Ext.data.Proxy Proxies}.
38 Now that we have a {@link Ext.data.Model Model} which defines our data structure, and we've loaded several {@link Ext.data.Model Model} instances into a {@link Ext.data.Store Store}, we're ready to display the data using a {@link Ext.grid.Panel Grid Panel}:
40 Ext.create('Ext.grid.Panel', {
41 renderTo: Ext.getBody(),
45 title: 'Application Users',
55 text: 'Email Address',
68 And that's all there is to it. We just created a {@link Ext.grid.Panel Grid Panel} that renders itself to the body element, and we told it to get its data from the `userStore` {@link Ext.data.Store Store} that we created earlier. Finally we defined what columns the {@link Ext.grid.Panel Grid Panel} will have, and we used the `dataIndex` property to configure which field in the `User` {@link Ext.data.Model Model} each column will get its data from. The `Name` column has a fixed width of 100px and has sorting and hiding disabled, the `Email Address` column is hidden by default (it can be shown again by using the menu on any other column), and the `Phone Number` column flexes to fit the remainder of the {@link Ext.grid.Panel Grid Panel}'s total width. To view this example live, see the [Simple Grid Example](guides/grid/examples/simple_grid/index.html).
72 You can use the `renderer` property of the column config to change the way data is displayed. A renderer is a function that modifies the underlying value and returns a new value to be displayed. Some of the most common renderers are included in {@link Ext.util.Format}, but you can write your own as well:
77 dataIndex: 'birthDate',
78 // format the date using a renderer from the Ext.util.Format class
79 renderer: Ext.util.Format.dateRenderer('m/d/Y')
82 text: 'Email Address',
84 // format the email address using a custom renderer
85 renderer: function(value) {
86 return Ext.String.format('<a href="mailto:{0}">{1}</a>', value, value);
91 See the [Renderers Example](guides/grid/examples/renderers/index.html) for a live demo that uses custom renderers.
96 {@img grouping.png Grouping Grid}
98 Organizing the rows in a {@link Ext.grid.Panel Grid Panel} into groups is easy, first we specify a {@link Ext.data.Store#groupField groupField} property on our store:
101 Ext.create('Ext.data.Store', {
104 groupField: 'department'
107 For more on gouping in {@link Ext.data.Store Store}s please refer to the [Data guide](#/guide/data). Next we configure a grid with a grouping {@link Ext.grid.feature.Feature Feature} that will handle displaying the rows in groups:
110 Ext.create('Ext.grid.Panel', {
112 features: [{ ftype: 'grouping' }]
115 See [Grouping Grid Panel](guides/grid/examples/grouping/index.html) for a live example.
120 Sometimes {@link Ext.grid.Panel Grid Panel}s are use only to display data on the screen, but usually it is necessary to interact with or update that data. All {@link Ext.grid.Panel Grid Panel}s have a {@link Ext.selection.Model Selection Model} which determines how data is selected. The two main types of Selection Model are {@link Ext.selection.RowModel Row Selection Model}, where entire rows are selected, and {@link Ext.selection.CellModel Cell Selection Model}, where individual cells are selected.
122 {@link Ext.grid.Panel Grid Panel}s use a {@link Ext.selection.RowModel Row Selection Model} by default, but it's easy to switch to a {@link Ext.selection.CellModel Cell Selection Model}:
124 Ext.create('Ext.grid.Panel', {
125 selType: 'cellmodel',
129 Using a {@link Ext.selection.CellModel Cell Selection Model} changes a couple of things. Firstly, clicking on a cell now selects just that cell (using a {@link Ext.selection.RowModel Row Selection Model} will select the entire row), and secondly the keyboard navigation will walk from cell to cell instead of row to row. Cell-based selection models are usually used in conjunction with editing.
133 {@link Ext.grid.Panel Grid Panel} has build in support for editing. We're going to look at the two main editing modes - row editing and cell editing
137 Cell editing allows you to edit the data in a {@link Ext.grid.Panel Grid Panel} one cell at a time. The first step in implementing cell editing is to configure an editor for each {@link Ext.grid.column.Column Column} in your {@link Ext.grid.Panel Grid Panel} that should be editable. This is done using the {@link Ext.grid.column.Column#editor editor} config. The simplest way is to specify just the xtype of the field you want to use as an editor:
139 Ext.create('Ext.grid.Panel', {
143 text: 'Email Address',
150 If you need more control over how the editor field behaves, the {@link Ext.grid.column.Column#editor editor} config can also take a config object for a Field. For example if we are using a {@link Ext.form.field.Text Text Field} and we want to require a value:
161 You can use any class in the `Ext.form.field` package as an editor field. Lets suppose we want to edit a column that contains dates. We can use a {@link Ext.form.field.Date Date Field} editor:
166 dataIndex: 'birthDate',
171 Any {@link Ext.grid.column.Column}s in a {@link Ext.grid.Panel Grid Panel} that do not have a {@link Ext.grid.column.Column#editor editor} configured will not be editable.
173 Now that we've configured which columns we want to be editable, and the editor fields that will be used to edit the data, the next step is to specify a selection model. Let's use a {@link Ext.selection.CellModel Cell Selection Model} in our {@link Ext.grid.Panel Grid Panel} config:
176 Ext.create('Ext.grid.Panel', {
181 Finally, to enable editing we need to configure the {@link Ext.grid.Panel Grid Panel} with a {@link Ext.grid.plugin.CellEditing Cell Editing Plugin}:
183 Ext.create('Ext.grid.Panel', {
185 selType: 'cellmodel',
187 Ext.create('Ext.grid.plugin.CellEditing', {
193 And that's all it takes to create an editable grid using cell editing. See [Cell Editing](guides/grid/examples/cell_editing) for a working example.
195 {@img cell_editing.png Cell Editing Grid}
199 Row editing enables you to edit an entire row at a time, rather than editing cell by cell. Row editing works in exactly the same way as cell editing - all we need to do is change the plugin type to {@link Ext.grid.plugin.RowEditing} and set the selType to `rowmodel`.
201 Ext.create('Ext.grid.Panel', {
205 Ext.create('Ext.grid.plugin.RowEditing', {
211 [Row Editing - Live Example](guides/grid/examples/row_editing)
213 {@img row_editing.png Row Editing Grid}
217 Sometimes your data set is too large to display all on one page. {@link Ext.grid.Panel Grid Panel} supports two different methods of paging - {@link Ext.toolbar.Paging Paging Toolbar} which loads pages using previous/next buttons, and {@link Ext.grid.PagingScroller Paging Scroller} which loads new pages inline as you scroll.
221 Before we can set up either type of paging on a {@link Ext.grid.Panel Grid Panel}, we have to configure the {@link Ext.data.Store Store} to support paging. In the below example we add a {@link Ext.data.Store#pageSize pageSize} to the {@link Ext.data.Store Store}, and we configure our {@link Ext.data.reader.Reader Reader} with a {@link Ext.data.reader.Reader#totalProperty totalProperty}:
223 Ext.create('Ext.data.Store', {
229 url : 'data/users.json',
233 totalProperty: 'total'
238 The {@link Ext.data.reader.Reader#totalProperty totalProperty} config tells the {@link Ext.data.reader.Reader Reader} where to get the total number of results in the JSON response. This {@link Ext.data.Store Store} is configured to consume a JSON response that looks something like this:
244 { "name": "Lisa", "email": "lisa@simpsons.com", "phone": "555-111-1224" },
245 { "name": "Bart", "email": "bart@simpsons.com", "phone": "555-222-1234" },
246 { "name": "Homer", "email": "home@simpsons.com", "phone": "555-222-1244" },
247 { "name": "Marge", "email": "marge@simpsons.com", "phone": "555-222-1254" }
251 For more on {@link Ext.data.Store Stores}, {@link Ext.data.proxy.Proxy Proxies}, and {@link Ext.data.reader.Reader Readers} refer to the [Data Guide](#/guide/data).
255 Now that we've setup our {@link Ext.data.Store Store} to support paging, all that's left is to configure a {@link Ext.toolbar.Paging Paging Toolbar}. You could put the {@link Ext.toolbar.Paging Paging Toolbar} anywhere in your application layout, but typically it is docked to the {@link Ext.grid.Panel Grid Panel}:
257 Ext.create('Ext.grid.Panel', {
261 xtype: 'pagingtoolbar',
262 store: userStore, // same store GridPanel is using
268 {@img paging_toolbar.png Paging Toolbar}
270 [Paging Toolbar Example](guides/grid/examples/paging_toolbar/index.html)
274 Grid supports infinite scrolling as an alternative to using a paging toolbar. Your users can scroll through thousands of records without the performance penalties of renderering all the records on screen at once. The grid should be bound to a store with a pageSize specified.
276 Ext.create('Ext.grid.Panel', {
277 // Use a PagingGridScroller (this is interchangeable with a PagingToolbar)
278 verticalScrollerType: 'paginggridscroller',
279 // do not reset the scrollbar when the view refreshs
280 invalidateScrollerOnRefresh: false,
281 // infinite scrolling does not support selection
282 disableSelection: true,
286 [Infinite Scrolling Example](extjs/examples/grid/infinite-scroll.html)