2011-02-15 37 views
1

我有以下問題加載一個下拉:jqGrid的禁用由dataUrl

裏面一個jqGrid的存在與選項dataUrl從服務器獲取數據的下拉列表。 如果我單擊窗體編輯(或添加)下拉列表是好的,但如果行已存在,我需要禁用它。我看到通過使用afterShowForm事件,它僅在下拉列表已經填充(第一次後)時才起作用。第一次,在下拉菜單填充dataUrl之前,似乎afterShowForm被觸發。

我該如何解決這個問題?

回答

3

在我看來,禁用下拉菜單的最簡單方法是使用editoptions中的buildSelect事件,另外還有dataUrl。如果dataUrl返回的數據已經正確 形式buildSelect可以只返回輸入參數回來,但一個可以另外禁用

您還應該使用recreateForm:true的形式,以確保所有的回調將始終調用。代碼模式可以大約如下:

var needDisable=true; 
$("#list").jqGrid({ 
    colModel:[ 
     {name:'myDropDown',editable: true,edittype:"select", 
     editoptions:{dataUrl:'myDropDown.txt', 
         buildSelect: function(data) { 
          var field_id=this.id; // "myDropDown" 
          setTimeout(function(){ 
           if (needDisable) { 
            $('#tr_'+field_id).attr('disabled','disabled'); 
           } else { 
            $('#tr_'+field_id).removeAttr('disabled'); 
           } 
          }, 100); 
          return data; 
         } 
     }, 
     // ... other colModel columns 
    ], 
    // ... other jqGrid parameters 
}).jqGrid('navGrid','#pager',{}, 
      { // Edit form parameters 
       recreateForm:true, 
       beforeShowForm:function(form){ 
        needDisable=true; 
       } 
      }, 
      { // Add form parameters 
       recreateForm:true, 
       beforeShowForm:function(form){ 
        needDisable=false; 
       } 
      }); 
+0

@Angelinux:歡迎您!順便說一下,從15點的聲望開始,您有權使用投票方式提供有用的問題或答案(有關更多信息,請參閱http://stackoverflow.com/faq#howtoask)。該功能可幫助其他人更有效地搜索有關計算器上的信息。 – Oleg 2011-02-15 15:28:28

0

我不得不想出瞭解決這個列表問題的解決方案。添加一行時,我顯示一個現有值列表,並且還有一個文本字段,供用戶在需要時添加新值(我的組合框版本)。在編輯一行時,我想在文本字段而不是列表中顯示該值,並刪除「添加」字段。此外,該行一旦存在,該值就不可編輯。

我的解決方案:分別beforeEdit:

navigatorAddOptions和navigatorEditOptions使用beforeInitData:beforeAdd和beforeInitData。 beforeShowForm不起作用。兩者都使用recreateForm:true。

前...功能:

function beforeAdd(formid) { 
    $("#gridTable").jqGrid('setColProp','listfield',{edittype:'select',editoptions:{readonly:false,dataUrl:'url_to_list.action'}}); 
    $("#gridTable").jqGrid('setColProp','newvaluefield',{hidden:false}); 
}; 

function beforeEdit(formid) { 
    $("#gridTable").jqGrid('setColProp','listfield',{edittype:'text',editoptions:{readonly:true}}); 
    $("#gridTable").jqGrid('setColProp','newvaluefield',{hidden:true}); 
}; 
0

// WORKS:隱藏工具欄下拉菜單中選擇
// $( 「#」 + COLUMNNAMES [1]).hide();

0

如果你有名稱的列名是pid,我得到了它這樣

在編輯

beforeShowForm:function(form) 
    $("#tr_pid").find("input,button,textarea,select").attr("disabled",true); 
} 

beforeShowForm:function(form){ 
    $("#tr_pid").find("input,button,textarea,select").attr("disabled",false); 
} 
0

對我來說,答案在這裏沒有工作還是太複雜了。

在我的情況,我想等待一個特定的下拉列表存在,並且有一個選擇的值。(但是你可以用其他的標準....)

我的下拉菜單是使用dataURL加載項目,以便它需要一段時間才能在屏幕上顯示。

如果有人從谷歌搜索這裏登陸到如何等待控件加載到首次編輯/添加窗體顯示 ....

我的解決辦法是遞歸和的setTimeout的在JavaScript的組合:

function WaitForDropDownToBeLoadedAndProcess() { 

    var dropDownVal= $("#MyDropDown").val(); 

    if (!dropDownVal) {//if the value is undefined called this method recursively 
     setTimeout(function() {//use setTimeout to avoid blocking 

      WaitForDropDownToBeLoadedAndProcess(); 

     }, 150); 

    } else {//if the dropdown has a value 

     //do your logic here... like disabling the control or set value 

    }  
} 

我迷上它給電網這樣的:

afterShowForm:function(formid) { 

    WaitForDropDownToBeLoadedAndProcess(); 
}