Common Editing Properties
One of the key reasons for displaying data in a grid is to edit it, quickly and easily. jqGrid supports editing data in three ways:
- cell editing: edit specific cells in a gird
- inline editing: edit several cells in the same row
- form editing: create a form to edit outside of the grid
Installation
Every editing module has its own description in the Download Manager, but all of them uses the common module which should be selected (marked ) if you plan to use the editing. For more information refer to Download.
For Developers - this is the grid.common.js in the src directory.
Options and Description
All editing modules uses a common properties in colModel in order to perform editing. Below is the list of these properties with detailed description:
- editable
- edittype
- editoptions
- editrules
- formoptions (valid only in form editing)
The common syntax of using these options is:
<script> jQuery("#grid_id").jqGrid({ ... colModel: [ ... {name:'price', ..., editable:true, edittype:'text', editoptions:{...}, editrules:{...}, formoptions:{...} }, ... ] ... }); </script>
For all other specific options and events refer to the appropriate module.
editable
The editable option is boolean and can have two values true or false. The option defines if this field is editable (or not). Default is false. To make a field editable, set this to true: editable:true.
We should mention that the hidden fields are not editable instead that they have been marked as editable. In in-line and cell editing modules you should show these fields (using showCol method) in order to edit it. In form editing module you should use editrules option (see below)
edittype
Edittype option defines the type of of the editable field. Possible values: 'text', 'textarea', 'select', 'checkbox', 'password', 'button', 'image', 'file' and 'custom'. The default value is 'text'.
text
When edittype is 'text', jqGrid constructs a input tag of type text:
<input type="text" ...../>
In editoptions we can set all the possible attributes for this field. For example,
... editoptions: {size:10, maxlength: 15}
will cause jqGrid to construct the following input
<input type="text" size="10" maxlength="15" />
In addition to the these settings, jqGrid adds the id and name attribute.
textarea
When edittype is 'textarea', jqGrid constructs a input tag of type textarea
<input type="textarea" .../>
In editoptions we can add additional attributes to this type. Typically, these govern the size of the box:
... editoptions: {rows:"2",cols:"10"}
<input type="textarea" rows="2" cols="10".../>
To these attributes jqGrid adds id and name attributes .
checkbox
When edittype is 'checkbox', jqGrid constructs a input tag as follows:
<input type="checkbox" .../>
editoptions is used to define the checked and unchecked values. The first value is checked. For example
...editoptions: { value:"Yes:No" }
This will construct
<input type="checkbox" value="Yes" offval="No".../>
defines a checkbox in which when the value is Yes the checkbox becomes checked, otherwise unchecked. This value is passed as parameter to the editurl.
If in the editoptions the value property is not set jqGrid search for the following values (false|0|no|off|undefined) in order to construct checkbox. If the cell content does not contain one of these values then the value attribute becomes the cell content and offval is set to off.
Example if the cell content is true, then
<input type="checkbox" value="true" offval="off" checked.../>
To these attributes jqGrid adds id and name attributes .
select
When edittype is 'select', jqGrid constructs a input tag as follows:
<select> <option value='val1'> Value1 </option> <option value='val2'> Value2 </option> ... <option value='valn'> ValueN </option> </select>
To construct this element we have three possible variants
- Setting editoptions value as string
The editoptions value must contain a set of value:label pairs with the value separated from the label with a colon (:) and ended with(;). Whichever you use, something like the following
editoptions: { value: “FE:FedEx; IN:InTime; TN:TNT” }
will construct
<select> <option value='FE'> FedEx </option> <option value='IN'> InTime </option> <option value='TN'> TNT </option> </select>
- Seting editoptions value as object
In this case the editoptions value must contain array {} with name value property. Below is example:
... colModel : [ ... {name:'myname', edittype:'select', editoptions:{value:{1:'One',2:'Two'}} }, ... ] ...
This will construct select
<select> <option value='1'>One</option> <option value='2'>Two</option> </select>
- Setting editoptions dataUrl parameter
The editoptions dataUrl parameter is valid only for element of edittype:select. The dataUrl parameter represent the url from where the html select element should be get.
When this option is set, the element will be filled with values from the ajax request. The data should be a valid html select element with the desired options - something like:
<select> <option value='1'>One</option> <option value='2'>Two</option> ... </select>
To this element, jqGrid adds the id and name attributes as above.
Multiple selection of options in a select box is also possible. Also the size attribute can be added too
...editoptions: {multiple:true, size:3... }
password
When edittype is 'password', jqGrid constructs a input tag of type text:
<input type="password" ...../>
In editoptions we can set all the possible attributes for this field. For example,
... editoptions: {size:10, maxlength: 8}
will cause jqGrid to construct the following input
<input type="password" size="10" maxlength="8" />
In addition to the these settings, jqGrid adds the id and name attribute.
button
When edittype is 'button', jqGrid constructs a input tag of type text:
<input type="button" ...../>
In editoptions we can set all the possible attributes for this field. For example,
... editoptions: {value:'MyButton'}
will cause jqGrid to construct the following input
<input type="button" value="MyButton" />
In addition to the these settings, jqGrid adds the id and name attribute.
image
When edittype is 'image', jqGrid constructs a input tag of type text:
<input type="image" ...../>
In editoptions we can set all the possible attributes for this field. For example,
... editoptions: {src:'path_to_my_image'}
will cause jqGrid to construct the following input
<input type="image" src="path_to_my_image" />
In addition to the these settings, jqGrid adds the id and name attribute.
file
When edittype is 'file', jqGrid constructs a input tag of type text:
<input type="file" ...../>
In editoptions we can set all the possible attributes for this field. For example,
... editoptions: {alt:'Alt text'}
will cause jqGrid to construct the following input
<input type="file" alt="Alt text"... />
In addition to the these settings, jqGrid adds the id and name attribute.
custom
This edit type allows definition of a custom editable element. When the edit type is set to custom we should provide a set of two functions, one which creates the element, and one that gets the value from the form in order to be posted to the server.
The functions that should be defined:
- custom_element - this function is used to create the element. The function should return the new DOM element. Parameters passed to this function are the value and the editoptions from colModel.
- custom_value - this function should return the value from the element after the editing in order to post it to the server. Parameter passed to this function is the element object
When the custom element is created we automatically do the following additinal tasks:
- add a class 'customelement'
- add attribute name with name from colModel
- add id according to the rules for every edited module.
The example above will create element input type text:
<script> function myelem (value, options) { var el = document.createElement("input"); el.type="text"; el.value = value; return el; } function myvalue(elem) { return $(elem).val(); } jQuery("#grid_id").jqGrid({ ... colModel: [ ... {name:'price', ..., editable:true, edittype:'custom', editoptions:{custom_element: myelem, custom_value:myvalue} }, ... ] ... }); </script>
editoptions
The editoptions property is an array which contains important information about the editing column. It is important to note that in the editoptions array you can set any valid attribute for the chosen edittype.
The editoptions property is used in colModel array and the syntax is
<script> jQuery("#grid_id").jqGrid({ ... colModel: [ ... {name:'price', ..., editoptions:{name1:value1...}, editable:true }, ... ] ... }); </script>
i.e. in name:value pair. Below is the list of most commonly used options:
| Property | Type | Description |
|---|---|---|
| value | mixed | When set for edittype checkbox this value should be a string with two possible values separated with a colon (:) - Example editoptions:{value:“Yes:No”} where the first value determines the checked property. When set for edittype select value can be a string, object or function. If the option is a string it must contain a set of value:label pairs with the value separated from the label with a colon (:) and ended with(;). The string should not ended with a (;)- editoptions:{value:“1:One;2:Two”}. If set as object it should be defined as pair name:value - editoptions:{value:{1:'One';2:'Two'}} When defined as function - the function should return either formated string or object. In all other cases this is the value of the input element if defined. |
| dataUrl | string | This option is valid only for the elements of type select - i.e., edittype:select and should represent the url for getting the data that should contain the select definition. The data is obtained via ajax call and should be a valid html select element with the desired options <select><option value='1'>One</option>…</select>. In this case you can use option group. The ajax request is called only once when the element is created. In inline edit or cell edit module it is called every time when you edit a new row or cell. In form edit module only once. |
| buildSelect | function | This option have sense only if the dataUrl parameter is set. In case where the server response can not build the select element you can use your on function to build the select. The function should return a string containing the select and options value(s) as described in dataUrl option. Parameter passed to this function is the server response |
| dataInit | function | To this function, if defined, we pass the element object. This function is called only once when the element is created. Example : …editoptions: { dataInit : function (elem) { $(elem).autocomplete(); } } The event is called only once when the element is created. In inline edit or cell edit module it is called every time when you edit a new row or cell. In form edit module only once if the recreateForm option is set to false and every time if the same option is set to true . Note: Some plugins requie to know the position of the element into the DOM and since this event is raised before inserting the element into the DOM you can use a setTimeout function to acomplish the desired action. This is especially valid for jQuery UI datepicker (1.7.x and up releases) |
| dataEvents | array | list of events to apply to the data element; uses $(”#id”).bind(type, [data], fn) to bind events to data element. Should be described like this: … editoptions: { dataEvents: [ { type: 'click', data: { i: 7 }, fn: function(e) { console.log(e.data.i); } }, { type: 'keypress', fn: function(e) { console.log('keypress'); } } ] } |
| defaultValue | mixed | The option can be string or function. This option is valid only in Form Editing module when used with editGridRow method in add mode. If defined the input element is set with this value if only element is empty. If used in selects the text should be provided and not the key. Also when a function is used the function should return value. |
| other options | mixed | In this case you can set any other valid attribute for the editable element. By Example if the element is edittype:'text' we can set size, maxlenght and etc. attributes. Refer to the valid attributes of of the element |
editrules
This option add additional properties to the editable element and should be used in colModel. Mostly it is used to validate the user input before submitting the value(s) to the server. Syntax:
<script> jQuery("#grid_id").jqGrid({ ... colModel: [ ... {name:'price', ..., editrules:{edithidden:true, required:true....}, editable:true }, ... ] ... }); </script>
Below is the list of available options:
| Option | Type | Description |
|---|---|---|
| edithidden | boolean | This option is valid only in form editing module. By default the hidden fields are not editable. If the field is hidden in the grid and edithidden is set to true, the field can be edited when add or edit methods are called. |
| required | boolean | (true or false) if set to true, the value will be checked and if empty, an error message will be displayed. |
| number | boolean | (true or false) if set to true, the value will be checked and if this is not a number, an error message will be displayed. |
| integer | boolean | (true or false) if set to true, the value will be checked and if this is not a integer, an error message will be displayed. |
| minValue | number(integer) | if set, the value will be checked and if the value is less than this, an error message will be displayed. |
| maxValue | number(integer) | if set, the value will be checked and if the value is more than this, an error message will be displayed. |
| boolean | if set to true, the value will be checked and if this is not valid e-mail, an error message will be displayed | |
| url | boolean | if set to true, the value will be checked and if this is not valid url, an error message will be displayed |
| date | boolean | if set to true a value from datefmt option is get (if not set ISO date is used) and the value will be checked and if this is not valid date, an error message will be displayed |
| time | boolean | if set to true, the value will be checked and if this is not valid time, an error message will be displayed. Currently we support only hh:mm format and optional am/pm at the end |
| custom | boolean | if set to true allow definition of the custom checking rules via a custom function. See below |
| custom_func | function | this function should be used when a custom option is set to true. Parameters passed to this function are the value, which should be checked and the name - the property from colModel. The function should return array with the following parameters: first parameter - true or false. The value of true mean that the checking is successful false otherwise; the second parameter have sense only if the first value is false and represent the error message which will be displayed to the user. Typically this can look like this [false,”Please enter valid value”] |
Custom Checking example
<script> function mypricecheck(value, colname) { if (value < 0 && value >20) return [false,"Please enter value between 0 and 20"]; else return [true,""]; } jQuery("#grid_id").jqGrid({ ... colModel: [ ... {name:'price', ..., editrules:{custom:true, custom_func:mypricecheck....}, editable:true }, ... ] ... }); </script>
formoptions
This option is valid only in form editing. The purpose of these options is to reorder the elements in the form and to add some information before and after the editing element. Should be used in colModel array. Syntax:
<script> jQuery("#grid_id").jqGrid({ ... colModel: [ ... {name:'price', ..., formoptions:{elmprefix:'(*)', rowpos:1, colpos:2....}, editable:true }, ... ] ... }); </script>
Below is a list of available options
| Option | Type | Description |
|---|---|---|
| elmprefix | string | if set, a text or html content appears before the input element |
| elmsuffix | string | if set, a text or html content appears after the input element |
| label | string | if set, this replace the name from colNames array that appears as label in the form. |
| rowpos | number | determines the row position of the element (again with the text-label) in the form; the count begins from 1 |
| colpos | number | determines the column position of the element (again with thelabel) in the form beginning from 1 |
Discussion
Here's an example of using editoptions dataEvents to change another form element based on an onChange event in a <select>. In this case, the form contains Job_Name and Job_Number fields. The value of the Job_Number field is set using the value of the selected Job_Name option.
{ name: 'Job_Number', index: '`Job #`', editable: true, edittype: 'text', editoptions: { size: 10, readonly: 'readonly'}, editrules: {required: true }, formoptions: { label: 'Job #' }, width: 10, formatter: 'integer', formatoptions: { thousandsSeparator: '' }, searchoptions: { sopt: ['eq','ne','lt','le','gt','ge', 'in', 'ni'] }, align: 'right', sortable: true }, { name: 'Job_Name', index: '`Job Name`', editable: true, edittype: 'select', editoptions: { size: 1, dataUrl: 'Includes/tblJobSelect.php', dataEvents: [ { type: 'change', fn: function(e) { $('input#Job_Number').val(this.value); } } ] }, formoptions: { label: 'Job Name' }, searchoptions: { sopt: ['eq','ne','lt','le','gt','ge', 'cn', 'nc', 'bw', 'bn'] }, align: 'right', width: 150, align: 'left', sortable: true },this - in $('input#Job_Number').val(this.value); - refers to the DOM element associated with the onChange event, the Job_Name <select>, in this case.
The dataUrl returns plain text HTML ”<select><option value=999>Some Job Name</option>…</select>” that jqGrid uses to create the select.
Notice the use of the readonly attribute on the Job_Number field.
I am trying to have an edit form with two selection lists that are connected, similar to the above example. The first list is a group of main categories and the second is a list of subcategories relating to the main category. When the user chooses the main category, the list of subcategories should update so the user only sees relevant sub-categories.
Using the above technique from David Hansen, I can get the first list to update the second list whenever the user changes the first list. However, I need to populate the second list with an initial set of values, in case the user does not change the first list (for example, if they only want to change the subcategory, not the category).
Is there a hook I can use generate a change event from the first selection list? The code to generate the event itself is easy, but I am just having trouble figuring out how to get it called after the form is created.
Bill, this maybe help you..
http://oviedos.com.mx/index.php/blog/show/JqGrid-Como-agregar-un-onchange-onclick-en-un-input.html
Is there documentation/specification about server responses on success/error. I was not able to find in here, also examples have just php snippet about how to read data.
can some one help me????, i am new in jqgrid
i need to use autocomplete in edit row mode when i am in a cell, i need to select a item in the list of autocomplete and put some values that came with the row in the autocomplete options inside the row that i am editing, i try to set the values in this form
jQuery('#list').setRowData(rowid,{C_trtmnto:row[0], pdgree:row[2], orgen:row[3]}); but this don´t work
the autocomplete row came like this: 1 | 'cesar' | 'sales' | 'door'
How can i do this????
my col model is
{name: 'nm_fmlias', width : 60, editable: true, sortable : true, formoptions: {elmprefix:”(*) ” }, editrules : {required:true}, editoptions: {size:80,maxlength:250, dataInit:function(el){
$(el).autocomplete('../lib/lookup.php?qry=cruz', { minChars:1, mustMatch: true, autoFill: true, //max: 12, scrollHeight: 220, formatItem: function(data, i, total) { return data[1]; }, formatResult: function(row) { return row[1]; } }).result(function(event, row,rowid) { jQuery('#list').setRowData(rowid,{C_trtmnto:row[0], pdgree:row[2], orgen:row[3]}); this don´ts work } });Hello, the way I do this (I confess I had to get help to develop it, I did not figure it out on my own) is this:
$(elem).autocomplete({ source: "someurl", minLength: 3, select: function(event, ui) { $("#cvname").val(ui.item.label); }, change: function(event,ui) { if(!ui.item) { something here in response to selecting nothing } } })the inportant parts are, of course, the “select” and “change” events
hope this helps,
Reg
Is there way to have multiple checkboxes? I see that there's an option “multiple” for select box but users prefer checkboxes which are more user friendly.