jqgrid 實現行編輯,表單編輯的列聯動,jqgrid表單

來源:互聯網
上載者:User

jqgrid 實現行編輯,表單編輯的列聯動,jqgrid表單

這個問題的情境相信大家都遇到過,比如有A,B,C三列,B,C列均為下拉框,但是C列的值是由B列的值來決定的,即C列中的值是動態變化的,變化的依據就是B列中你選擇的值。本文給出的是一個實用,簡易快捷的實現方式。先看圖:


本例子實現的如果是常白班,則班別那一列只顯示白班,否則的話,那就顯示白晚班。可以看成是兩列聯動。

實現核心代碼為:

 onSelectRow: function (id) {                if (id && id !== lastSel) {                    jQuery("#TblClassTypeId").restoreRow(lastSel);                    lastSel = id;                }                var editkey = $('#TblClassTypeId').jqGrid('getCell', id, 'Id_Key');                var editparameters = {                    keys: true,                    extraparam: {                        "editkey": editkey                    },                    oneditfunc: function () {                        $('#' + id + '_WorkerId').attr('readonly', true);                    }                };                jQuery("#TblClassTypeId").editRow(id, editparameters);                $('#' + id + '_IsAlwaysDay').change(function () {                    var selectvalue = $(this).val();                    var classTypeCol = $('#' + id + '_ClassType');                    classTypeCol.empty();                    if (selectvalue == "是") {                        classTypeCol.append("<option value=\"白班\">白班</option>");                    }                    else                    {                        classTypeCol.append("<option value=\"白班\">白班</option>")                                    .append("<option value=\"晚班\">晚班</option>");                    }                });                },
在行編輯模式中,選擇觸發動作為選擇行(onSelectRow)時。這時,輸入單元格的空間Id為id+"_colName"。id為行的id.  拿到控制項的Id,就可以添加select的change事件。在這個事件中可以進行聯動列的處理。如上面代碼,由於下拉選項比較簡單,我選擇直接賦值。如果下拉選項比較多的話,可以用ajax從服務端擷取。

實現行編輯模式中的列聯動是不是很簡單。相對於網上介紹的用列的formaterr與unformat和custom_element與custom_value的確簡單了很多。


下面我們來看看錶單編輯模式的聯動,同樣實現也很簡單。在中點擊新增,將會出現如下介面:


核心代碼為:

 //添加          {              beforeShowForm : function (formid)              {                  $('#WorkerId', formid).removeAttr("readonly", "readonly");                  $('#IsAlwaysDay',formid).change(function () {                      var selectvalue = $(this).val();                      var classTypeCol = $('#ClassType',formid);                      classTypeCol.empty();                      if (selectvalue == "是") {                          classTypeCol.append("<option value=\"白班\">白班</option>");                      }                      else {                          classTypeCol.append("<option value=\"白班\">白班</option>")                                      .append("<option value=\"晚班\">晚班</option>");                      }                  });              },              reloadAfterSubmit: true,          },

在添加按鈕對應的事件beforeShowForm中,擷取控制項Id為$(#colName,formId).   formId為jqgird自動傳送給我們的。擷取到控制項的Id後,後面的實現方式就很相似了。問題也就解決了。


關於這個實現方式,我也查了很多的資料,比對了不同的實現方式。總想找到一個快捷簡易的實現方式。當然,這隻是個示範樣本,如果實戰,這些代碼都可以進行再封裝重構,可以實現更簡單。

OK,講解完了,希望對大家有所協助。在這裡要感謝一下這個看起來有點像韓寒的兄弟:泰迪小賤熊,他的這篇文章jqGrid 行編輯 select 3級聯動 的一種實現方法給了我本文的實現靈感。



- jqGrid儲存格/行編輯模式下getRowData怎擷取資料行

參考jqGrid的原始碼,getRowData的實現方法是遍曆tr擷取td的innerhTML。 getRowData在儲存格和行編輯模式下受到影響,在表單編輯模式沒問題,因為表單沒有直接修改jqGrid產生輸入對象,而是在新的控制項中產生編輯對象。 要想在儲存格和行編輯模式下getRowData返回實際的資料行,而不是包含html代碼的內容,可以參考下面的。
對於儲存格編輯,需要先還原或者儲存此儲存格,然後再調用getRowData方法,實現如下
1、給grid添加beforeEditCell事件,聲明2個window域的變數記錄儲存格的行號和列號 beforeEditCell:function(rowid,cellname,v,iRow,iCol){ lastrow = iRow; lastcell = iCol; } 2、在調用getRowData擷取資料前,先儲存/還原儲存格 $("#grid").jqGrid("saveCell",lastrow,lastcell);//儲存儲存格,切換為文字模式 //或者===> //$("#grid").jqGrid("restoreCell",lastrow,lastcell);//還原儲存格,切換為文字模式 var recs=$("#grid").jqGrid("getRowData"); 對於行編輯模式,原理一樣,還原正在編輯的行或者儲存資料到記憶體中 1,調用editRow時傳遞oneditfunc事件處理函數儲存正在編輯的行的id $('#list4').jqGrid('editRow', rowid, true, function (rowid) { window.rowid=rowid; }); 2,在調用getRowData擷取資料前,先儲存/還原正在編輯的資料行 jQuery("#grid_id").saveRow(rowid, false, 'clientArray'); //==>或者還原 //jQuery("#grid_id").restoreRow(rowid); var recs=$("#grid").jqGrid("getRowData");
 
jqGrid儲存格是下拉框,可以實現選中行的二級聯動?

jqGrid構建了一個列表,其中的幾列為下拉框, 想實現當前選中行(例如選中其中一行)下拉框的二級聯動,誰能給我點思路? 之前想用setCell來做,但是這個方法改變的是整列的值,而不是一個下拉框的值。回答1:幫頂啦回答2:看看FindControl能找到控制項不回答3:引用2 樓 silentwins 的回複:看看FindControl能找到控制項不 我不是太明白,能不能說的更詳細點。回答4:我自己頂一下。回答5:請高手幫忙解答,感激涕零。回答6:到期不候啦。回答7:引用2 樓 silentwins 的回複:看看FindControl能找到控制項不 這個肯定不行啦。。。一般是Request.parms[你列名]回答8:我已經解決了,通過onCellSelect()和afterCellSelect()兩個事件解決的。回答10:求實列 代碼拜求
 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.