Grids in ExtJS 4 (Sencha) don’t allow to select content by default. But I want to make this possible.
I've tried this grid config:
viewConfig: {
disableSelection: true,
stripeRows: false,
getRowClass: function(record, rowIndex, rowParams, store){
return "x-selectable";
}
},
with these css classes (basically targeting every element I can see in Chrome):
/* allow grid text selection in Firefox and WebKit based browsers */
.x-selectable,
.x-selectable * {
-moz-user-select: text !important;
-khtml-user-select: text !important;
-webkit-user-select: text !important;
}
.x-grid-row td,
.x-grid-summary-row td,
.x-grid-cell-text,
.x-grid-hd-text,
.x-grid-hd,
.x-grid-row,
.x-grid-row,
.x-grid-cell,
.x-unselectable
{
-moz-user-select: text !important;
-khtml-user-select: text !important;
-webkit-user-select: text !important;
}
I know that you can override the grid row template in Ext 3 as below, but I don't know how to do the same in Ext 4:
templates: {
cell: new Ext.Template(
'<td class="x-grid3-col x-grid3-cell x-grid3-td-{id} x-selectable {css}" style="{style}" t开发者_如何转开发abIndex="0" {cellAttr}>',
'<div class="x-grid3-cell-inner x-grid3-col-{id}" {attr}>{value}</div>',
'</td>'
)
}
Any suggestions much appreciated.
You can add enableTextSelection: true to your viewConfig or apply the change globally for every grid with this:
Ext.override(Ext.grid.View, { enableTextSelection: true });
Combining several of these answers in the most Exty way.... Set enableTextSelection to true in the grid's view when creating the grid.
var grid = new Ext.grid.GridPanel({
viewConfig: {
enableTextSelection: true
},
});
You can add it like this, using renderer for the column
columns: [
{
header: "",
dataIndex: "id",
renderer: function (value, metaData, record, rowIndex, colIndex, store) {
return this.self.tpl.applyTemplate(record.data);
},
flex: 1
}
],
statics: {
tpl: new Ext.XTemplate(
'<td class="x-grid3-col x-grid3-cell x-grid3-td-{id} x-selectable {css}" style="{style}" tabIndex="0" {cellAttr}>',
'<div class="x-grid3-cell-inner x-grid3-col-{id}" {attr}>{value}</div>',
'</td>')
}
I just would like to add to Triquis answer: With ExtJS 4.1.0 you can enable the selection for treepanels as well:
Ext.override(Ext.view.Table, { enableTextSelection: true }); // Treepanels
Ext.override(Ext.grid.View, { enableTextSelection: true }); // Grids
Place this code somewhere early in your Ext.onReady() function or early in your application.
(Sorry, I am not able to post a comment to the answer of Triqui as I don't have the required reputation yet.)
An alternate way to do it might be to assign the classes to arbitrary html elements while using the new templatecolumn
. Here's a single column in a column definition I just wrote while porting an app to extjs4.
{
text: "Notes",
dataIndex: 'notes',
width: 300,
xtype: 'templatecolumn',
tpl: [
'<span class="x-grid3-col x-grid3-cell x-grid3-td-{id} x-selectable {css}"',
'style="{style}" tabIndex="0" {cellAttr}>',
'<span class="x-grid3-cell-inner x-grid3-col-{id}" {attr}>{notes}',
'</span></span>' ],
editor: {xtype:'textfield'}
}
For older version of EXTJS that doesnot support enable text selection. Following will work by assigning a new template to the grid cell. This works for EXTJS 3.4.0
var grid = new Ext.grid.GridPanel({
viewConfig: {
templates: {
cell: new Ext.Template(
'<td class="x-grid3-col x-grid3-cell x-grid3-td-{id}\
x-selectable {css}" style="{style}"\
tabIndex="0" {cellAttr}>',\
'<div class="x-grid3-cell-inner x-grid3-col-{id}"\
{attr}>{value}</div>',\
'</td>'
)
}
},
});
you can enable the selection for grid view with those few lines of code , it works very well in EXTJS 3.4 , with IE 11 and compatibility mode
if (!Ext.grid.GridView.prototype.templates) {
Ext.grid.GridView.prototype.templates = {};
}
Ext.grid.GridView.prototype.templates.cell = new Ext.Template(
'<td class="x-grid3-col x-grid3-cell x-grid3-td-{id} x-selectable {css}" style="{style}" tabIndex="0" {cellAttr}>',
'<div class="x-grid3-cell-inner x-grid3-col-{id}" {attr}>{value}</div>',
'</td>'
);
Value true is not working, Please use as following :
userSelectable: { bodyElement: 'text' },
精彩评论