:: Forum >> Version 1 >>

how to make a cell uneditable dynamically

Hi, how to make a cell uneditable dynamically
sai
Wednesday, June 22, 2005
all cells are uneditable by default, no need to do so.
Jim Hunter
Wednesday, June 22, 2005
i am using the input template for the grid and i want to make some cells uneditable based on a condition
sai
Thursday, June 23, 2005
I didnot test this but try this

obj.getRowTemplate(rowIndex).getItemTemplate(itemIndex).setAttribute("readOnly","true"
Kini
Friday, June 24, 2005
I've tried this but it doesn't seem to work, I am using input templates for the columns.
sai
Saturday, June 25, 2005
To do it, you need to modify "a few" the templates involved asking for a global variable-value switched inside a new Action defined previously for the object (obj.setAction("xxx")).
I made you an example that only allows to edit any cell avobe line 5.
HTH

<html>
<
head>
    <
stylebodyhtml {margin:0pxpadding0pxoverflowhidden;} </style>
    <
link href="lib/grid.css" rel="stylesheet" type="text/css" ></link>
    <
script src="lib/grid.js"></script>
    <
style>
        .
active-controls-grid {height100%; fontmenu;}
    </
style>

    <
script>
        var 
myData = [
            [
"MSFT","Microsoft Corporation""314,571.156""32,187.000""55000"],
            [
"ORCL""Oracle Corporation""62,615.266""9,519.000""40650"],
            [
"SAP""SAP AG (ADR)""40,986.328""8,296.420""28961"],
            [
"CA""Computer Associates Inter""15,606.335""3,164.000""16000"],
            [
"ERTS""Electronic Arts Inc.""14,490.895""2,503.727""4000"],
            [
"SFTBF""Softbank Corp. (ADR)""14,485.840"".000""6865"],
            [
"VRTS""Veritas Software Corp.""14,444.272""1,578.658""5647"],
            [
"SYMC""Symantec Corporation""9,932.483""1,482.029""4300"],
            [
"MSFT","Microsoft Corporation""314,571.156""32,187.000""55000"],
            [
"ORCL""Oracle Corporation""62,615.266""9,519.000""40650"]
        ];
        var 
myColumns = ["Ticker""Company Name""Market Cap.""$ Sales""Employees"];
    </
script>
</
head>
<
body>
    <
script>

if (!
window.MyMy=[];
if (!
My.TemplatesMy.Templates=[];

// ************************************************* 
//    Input Cell Template. 
// *************************************************** 
My.Templates.Input Active.Templates.Text.subclass(); 

My.Templates.Input.create = function(){ 
    var 
obj this.prototype

//    editor is not part of the template, 
//    there is only one single instance of editor object. 
    
var editor = new Active.HTML.INPUT
    
editor.setClass("templates""input"); 
    
editor.setAttribute("type""text"); 
    
editor.setAttribute("value", function(){ 
        return 
template.getItemProperty("text"); 
    }); 

//    template variable provides temporary reference 
//    to the parent template during edit mode. 
    
var template

    function 
switchToEditMode(){ 
        if (
template) { 
            
switchToTextMode() 
        } 
        
template this
//////////////////////////////////////////
      
this.action("AskForEdition"); 
if (
editable == "no"){   template null;  } 
////////////////////////////////////////
else{
        
template.element().className += " active-edit-mode "
        
template.element().innerHTML editor
        
editor.element().focus(); 
    
editor.setEvent("ondblclick"editor.element().focus()); 
  }
  }

    
obj.setEvent("ondblclick"switchToEditMode); 

    function 
switchToTextMode(){ 
        var 
value editor.element().value
        
template.setItemProperty("text"value); 
        
template.refresh(); 
        
template null
    } 
    
editor.setEvent("onblur"switchToTextMode); 
}; 

My.Templates.Input.create();
//**********************************
/////////////////////////////////////

    
var obj = new Active.Controls.Grid;
    
obj.setRowProperty("count"10);
    
obj.setColumnProperty("count"5);
    
obj.setDataProperty("text", function(ij){return myData[i][j]});
    
obj.setDataText = function(valueij){myData[i][j]=value}
    
obj.setColumnProperty("text", function(i){return myColumns[i]});
 
var 
editable "";

obj.setAction("AskForEdition", function(src){ 
 if (
src.getRowProperty("index") > ){editable "no"};
else {
editable "yes"}
});

var 
myvar0 = new My.Templates.Input;
var 
myvar1 = new My.Templates.Input;
var 
myvar2 = new My.Templates.Input;
var 
myvar3 = new My.Templates.Input;
var 
myvar4 = new My.Templates.Input;

obj.setColumnTemplate(myvar00);
obj.setColumnTemplate(myvar11);
obj.setColumnTemplate(myvar22);
obj.setColumnTemplate(myvar33);
obj.setColumnTemplate(myvar44);

document.write(obj);
    </
script>
</
body>
</
html>

 
Carlos
Sunday, June 26, 2005
Thanx a lot carlos, This works fine.
sai
Sunday, June 26, 2005
beautiful.but after modified like this,it can't active when use other browser except ie.second.I want use some other editors(or selectors) not just input,such as textarea,select(a list of option)...what can we do?modify the input template?
ren
Monday, January 9, 2006
Check out this post for a Firefox edit-Template cursor-fix (I think not included in V.1.0.2):
/javascript.forum.3536.13/saving-updates-to-a-database.html

Regarding your second question , the best choice is using a separate form, (where you can conditionally enable/disable editing on each control ), especially if need to use some data-validation, but for simple cases, is not a big effort to add two lines to a few custom templates.
(Or maybe I could not find any better solution)
Carlos
Monday, January 9, 2006



This topic is archived.

Back to support forum

Forum search