原代码:
switch (Rows[k].isModifyStatus)
{
case DWBUF_NEWMODIFY:
sUpdateType="i"
break;
case DWBUF_DATAMODIFY:
sUpdateType="u"
break;
case DWBUF_NOTMODIFY:
if (abSubitAll)
{ //提交所有数据
sUpdateType="n"
}
else
{
continue;
}
break;
default:
continue;
break;
}
DWBUF_NOTMODIFY是常量为0,可以当Rows[k].isModifyStatus确实为0的时候,
却无法进入其case语句执行,而进入default段执行了。用if else替换后的代码:
if (Rows[k].isModifyStatus==DWBUF_NEWMODIFY)
sUpdateType="i"
else if (Rows[k].isModifyStatus==DWBUF_DATAMODIFY)
sUpdateType="u"
else if (Rows[k].isModifyStatus==DWBUF_NOTMODIFY)
{
if (abSubitAll)
{ //提交所有数据
sUpdateType="n"
}
else
{
//check null
if (abCheckAll)
{
if (checkNull(k)==-1) return -1
}
continue;
}
}
else
{
if (Rows[k].isModifyStatus!=DWBUF_NEW) alert("不合法的行状态类型:"+Rows[k].isModifyStatus)
continue;
}
却能够正确执行

解决方案 »

  1.   

    Rows[k].isModifyStatus 和 case 项的类型要一致switch (Rows[k].isModifyStatus.toString())
    {
    case DWBUF_NEWMODIFY.toString():
    sUpdateType="i"
    break;
    case DWBUF_DATAMODIFY.toString():
    sUpdateType="u"
    break;
    case DWBUF_NOTMODIFY.toString():
    if (abSubitAll)
    { //提交所有数据
    sUpdateType="n"
    }
    else
    {
    continue;
    }
    break;
    default:
    continue;
    break;
    }
      

  2.   

    BlueDestiny
    vc版有个DestinyDoctor也是你吗?
      

  3.   

    <SCRIPT>
    var DWBUF_NEWMODIFY = 1
    var DWBUF_DATAMODIFY = 2
    var DWBUF_NOTMODIFY = 0 
    var sUpdateType
    var abSubitAll = true
    var Rows =  new Array();
    function MyObj(){
    this.isModifyStatus = 0;
    }
    function newHighlite(v) {
    Rows[0] = new MyObj();
    alert(typeof(Rows[0].isModifyStatus));
    alert(typeof(DWBUF_NOTMODIFY));
    alert(typeof(Rows[0].isModifyStatus.toString()));
    alert(typeof(DWBUF_NOTMODIFY.toString()));
    try{
    switch (Rows[0].isModifyStatus.toString()){
    case DWBUF_NEWMODIFY.toString():
    sUpdateType="i"
    alert("DWBUF_NEWMODIFY1");
    break;
    case DWBUF_DATAMODIFY.toString(): sUpdateType="u"
    alert("DWBUF_DATAMODIFY2");
    break;
    case DWBUF_NOTMODIFY.toString():
    if (abSubitAll)
    { //提交所有数据
    sUpdateType="n"
    }
    else
    {

    }
    alert("DWBUF_NOTMODIFY0");
    break;
    default:
    alert("default");

    break;
    } }
    catch(e){
    alert("Err")
    }
    }
    alert(end);
    </SCRIPT><input type=button value=button onclick="newHighlite()">正如ptma(守望者)说得
      

  4.   

    正如ptma(守望者) 和fantiny(乐于助人的菜鸟回归) 所说,
    用toString()后,问题解决,
    不过如fantiny写的,var DWBUF_NEWMODIFY = 1
    var DWBUF_DATAMODIFY = 2
    var DWBUF_NOTMODIFY = 0 我定义的是整数,而且在外部设置isModifyStatus的时候都是这种调用方式:
    dwBrowse.setrowstatus(uRow,dwBrowse.DW_NOTMODIFY)
    不可能出现如:
    dwBrowse.setrowstatus(uRow,"0")
    的赋值方式,请问一下,怎么在后来又变为字符串类型的了?
    这算是Javascript的bug吧?另外,用if没有问题,我测试过是应为if("0"==0) 是为真的。期待高手说明一下原理。
      

  5.   

    dwBrowse.setrowstatus(uRow,dwBrowse.DW_NOTMODIFY)
    关键是要看你里面的声明是什么类型,跟DW_NOTMODIFY的类型无关。javascript有自动转换类型的机制。
    switch也许比较特殊。
      

  6.   

    == (相等)与 === (严格相等)的区别在于恒等运算符在比较前强制转换不同类型的值。例如,恒等对字符串 "1" 与数值 1 的比较结果将为 true。而严格相等不强制转换不同类型的值,因此它认为字符串 "1" 与数值 1 不相同。基本的字符串、数值和布尔值是按值比较的。如果它们的值相同,比较结果为相等。对象(包括Array、Function、String、Number、Boolean、Error、Date以及 RegExp 对象)按引用比较。即使这些类型的两个变量具有相同的值,只有在它们正好为同一对象时比较结果才为 true。例如:// 具有相同值的两个基本字符串。
    var string1 = "Hello";
    var string2 = "Hello";// 具有相同值的两个 String 对象。
    var StringObject1 = new String(string1);
    var StringObject2 = new String(string2);// 比较结果为 true。
    if (string1 == string2)
         // 执行某些命令(将要运行的)。// 比较结果为 false。
    if (StringObject1 == StringObject2)
        //执行某些命令(不会运行)。// 要比较 String 对象的值, 
    // 用 toString() 或者 valueOf() 方法。
    if (StringObject1.valueOf() == StringObject2)
         //执行某些命令(将要运行的)。
      

  7.   

    fantiny(乐于助人的菜鸟回归) 答的够细
      

  8.   

    dwBrowse.setrowstatus(uRow,dwBrowse.DW_NOTMODIFY)
    关键是要看你里面的声明是什么类型,跟DW_NOTMODIFY的类型无关。javascript有自动转换类型的机制。
    switch也许比较特殊。
    -----
    我内部声明的确实是int型的
    控件外部属性初始值设为:
    <public:property NAME="DW_NOTMODIFY" VALUE=0 />
    <public:property NAME="DW_NEW" VALUE=1 />
    <public:property NAME="DW_NEWMODIFY" VALUE=2 />
    <public:property NAME="DW_DATAMODIFY" VALUE=3 />设置isModifyStatus也是用
    控件名.setrowstatus(uRow,控件名.DW_NOTMODIFY)的方法实现的setrowstatus方法的代码:
    function setRowStatus(row,status)
    {
    if (Rows.length == 0) return 1;

    Rows[row].isModifyStatus = status
    return 1;
    }不知道为什么它会给我转成字符类型。
    主要是这个问题想不明白。
      

  9.   

    <public:property NAME="DW_NOTMODIFY" VALUE=0 />我想就是因为这个实际是字符型的缘故 , (我不确定)