顯示具有 CheckboxModel 標籤的文章。 顯示所有文章
顯示具有 CheckboxModel 標籤的文章。 顯示所有文章

2022年10月7日 星期五

Grid 複選 - checkboxModel 的網路範例

Grid 複選 - checkboxModel 的網路範例

https://www.twblogs.net/a/5b8cc2872b717718833524ea


 

Ext --Grid複選框列

在網上找了好多但是都是所問非所答,最後找到了兩篇比較好的文章,記錄下


今天我們主要介紹一下grid的單選、多選功能,並告訴小夥伴們如何顯示一個選擇框列

extjs grid默認支持單選

在前面幾節的例子中,我們已經見識了extjs grid的強大。今天說到單選和多選,我們不妨打開前面的例子,其實在grid默認的情況下已經可以進行單選的,如圖:

image

extjs grid的行選擇

在extjs grid的配置項中,有兩個配置項和選擇有關:

  • selModel:選擇類型的對象,或者選擇類型的配置對象,可以進行更多的配置(單選、多選,多選框的位置等)
  • selType:選擇類型的字符串,不能進行更多的設置

selModel示例:

xtype: "grid",
store: myStore,
selModel: {
    selection: "rowmodel",
    mode: "MULTI"
},
columns: [
    { xtype: "rownumberer", text: "行號", width: 50 },
    { text: "姓名", dataIndex: "Name" },
    { text: "年齡", dataIndex: "Age" }
]

selType示例:

xtype: "grid",
store: myStore,
selType: "checkboxmodel",
columns: [
    { xtype: "rownumberer", text: "行號", width: 50 },
    { text: "姓名", dataIndex: "Name" },
    { text: "年齡", dataIndex: "Age" }
]

extjs grid 多行選則

上面已經介紹瞭如何進行選擇,下面就是實際的多選了。默認情況下extjs grid的選擇模型爲rowmodel,我們可以通過rowmodel進行行選擇(還有一個cellmodel,是用來進行單元格選擇的)。

rowmodel默認的選擇模型爲單行的選擇,也就是我們最開始看到的,只能選中一行,要想讓它支持多行選擇,就要進行相應的配置:

selModel: {
    selection: "rowmodel",
    mode: "MULTI"
}

注意配置項mode,這傢伙用來控制是單行選擇還是多行選擇的,可用的值有3個:

  • SINGLE:單行選擇
  • SIMPLE:多行選擇,單擊選中/取消選中行
  • MULTL:多行選擇,支持CTRL、SHIFT功能鍵,如果要進行多選,需要按住ctrl鍵。用shift可以進行區域選擇

extjs grid 使用多選框

使用選擇框的選擇模型是checkboxmodel,來看看下面的代碼:

xtype: "grid",
store: myStore,
selModel: Ext.create("Ext.selection.CheckboxModel", {
    injectCheckbox: 1,//checkbox位於哪一列,默認值爲0
    mode: "single",//multi,simple,single;默認爲多選multi
    checkOnly: true,//如果值爲true,則只用點擊checkbox列才能選中此條記錄
    allowDeselect: true,//如果值true,並且mode值爲單選(single)時,可以通過點擊checkbox取消對其的選擇
    enableKeyNav: true
}),
columns: [
    { xtype: "rownumberer", text: "行號", width: 50 },
    { text: "姓名", dataIndex: "Name" },
    { text: "年齡", dataIndex: "Age" }
]

效果如下:

image

extjs grid 獲取選中行

要得到選中行,我們首先要找到grid,然後得到grid的selectionModel,然後再找到選擇行,代碼如下:

var grid = win.down("grid");
var records = grid.getSelectionModel().getSelection();
Ext.MessageBox.alert("提示", records.length);

大家都知道GridPanel是一個非常好用的控件,但是沒有像C#一樣的自定義的複選框。那我們就手工給它加一個複選框列,並實現全選清除獲取選中的數據。以下GridPanel簡稱GP。

第一種:自己增加一個CheckColumn來實現選中與否

1.首先在GP的Store裏面增加一個是否選中的字段源:<ext:ModelField Name="IsSelect" Type="Boolean" DefaultValue="0"/>。因爲不用數據庫返回,所以直接設置默認值爲0,不選中。

2.在GP的ColumnModel裏,增加我們的第一行復選框:<ext:CheckColumn runat="server" ID="c1" Text="選擇" Editable="true" DataIndex="IsSelect" Width="40" /> 。

3.實現點擊複選框的時候界面能夠實現選中狀態。在GP的事件裏增加CellClick,我們命名爲:clickOne。

4.function clickOne(gridview, td, value, data, tr) {
        if (data.data.IsSelect)
            data.data.IsSelect = 1;
        else data.data.IsSelect = 0;
        App.GP.store.commitChanges();
        App.GP.view.refresh();
    }。其實就是改變數據源的IsSelect字段的值,然後在刷新GP,界面上看到的就是選中狀態了。

那麼接下來我們實現全選和清除全選就簡單多了。在GP增加2個全選和清除按鈕。調用的事件如下:

//清除所有選擇
    function clear() { 
         var dataList = App.GP.store.data.items;
         if (dataList.length > 0) {
             for (var i = 0; i < dataList.length; i++) {
                 var data = dataList[i].data;
                 if (data.IsSelect == 1) {
                     data.IsSelect = 0;
                 }
             }
         }
         App.GP.store.commitChanges();
         App.GP.view.refresh();
     }
     //全部選擇
     function selectAllMasterial() {
         var dataList = App.GP.store.data.items;
         if (dataList.length > 0) {
             for (var i = 0; i < dataList.length; i++) {
                 var data = dataList[i].data;
                 if (data.IsSelect == 0) {
                     data.IsSelect = 1;
                 }
             }
         }
         App.GP.store.commitChanges();
         App.GP.view.refresh();
     }

即可。

得到選中的數據則更簡單了:

var dataList = App.GP.store.data.items;
        if (dataList.length > 0) {
               for (var i = 0; i < dataList.length; i++) {
                      var data = dataList[i].data;
                      if (data.IsSelect == 1) {

//這裏就是你要獲取得到的數據,然後執行你自己的操作了

       }

       }

}

 

第二種:就是EXT.NET自帶的SelectionModel

1.在GP裏增加一個選中模板:

<SelectionModel>
<ext:CheckboxSelectionModel ID="CheckboxSelectionModel1" Mode="Multi" runat="server">

//這裏,可以加一系列的選中事件,這裏只列出了3個,其他自己去看看還有哪些
<Listeners>

<BeforeSelect Fn="" />

<Deselect Fn="" />

<Select FN="" />
 </Listeners>
</ext:CheckboxSelectionModel>
 </SelectionModel>

2.如果需要特殊處理,就在選中模板裏添加自己的事件。

3.獲取選中的數據:App.gpContractList.selModel.selected;即可。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

轉自:https://blog.csdn.net/evilcry2012/article/details/52918064

轉自:https://blog.csdn.net/lijingrong_ljr/article/details/50555336

2022年9月21日 星期三

V20301 – [刪除]鈕, - checkboxModel -刪除勾選的多筆資料 - 覆蓋原本event的處理 - 移除目前 store 資料

 目的:  [刪除]鈕,  -刪除勾選的多筆資料 - checkboxModel 

處理說明:  1>將 grid_Single 換成 checkboxModel class

                   2> 重寫 btn_del.onclick 處理 , 即  beforedel() 傳回 false, 不處理 parent.del 函式

                   3> 依勾選的資料, 一筆一筆從資料庫刪除 , 資料庫刪除後, 再刪除畫面的資料


1>*.js
 1>>置換成 CheckboxModel  class
    //加入 checkbox Model 
    Ext.getCmp('grid_Single').destroy(); //20220905
    var grid_Single = Ext.create('grid_Single', {
        id: 'grid_Single',
        resizable: true,
        selModel: Ext.create('Ext.selection.CheckboxModel', {
            selectionMode: 'SIMPLE',
            listeners: {
                /*selectionchange: function (cb, selected, eOpts) {
                    //view.selModel.getSelection()
                },*/
                RowMouseDown: function (view, record, item, index, e) {
                    var me = this;
                    if (index !== -1) {

                        if (!me.allowRightMouseSelection(e)) {
                            return;
                        }

                        if (e.shiftKey && me.lastFocused) {
                            me.selectRange(me.lastFocused, record, e.ctrlKey);
                            me.processSelection(view, record, item, index, e);
                        }

                        if (!me.isSelected(record)) {
                            me.mousedownAction = true;
                            me.processSelection(view, record, item, index, e);
                        } else {
                            me.mousedownAction = false;
                        }
                    }

                }
            }
        })
    });
    Ext.getCmp('tab2').add(grid_Single); //將grid加入到tab裡面
    Ext.getCmp('tab2').updateLayout();

 2>>重寫 btn_del.onclick 處理 , 即  beforedel() 傳回 false, 不處理 parent.del 函式

//20220922  覆蓋原本的 [刪除]鈕 處理,  自行處理
    //不執行 paretn.delete , beforeDel 傳回 false
    Ext.getCmp('btn_del').beforeDel = function () {
        return false;
    }

    var buttonModel = Ext.create('G_buttonModel');   //取得 目前的畫面狀態(1,2,3 : 新增/編輯/瀏覽)

    Ext.getCmp("btn_del").on('click', function (me,e,eOpts) {    
      //已置換 grid_store , 不需 .getView().
     //var cur_recs = Ext.getCmp('grid_Single').getView().getSelectionModel().getSelection(); 
        var cur_recs = Ext.getCmp('grid_Single').getSelectionModel().getSelection();
        var cur_rec;
        if (cur_recs.length == 0)
        {
            buttonModel.modelType = 0;
            mywarnalert('請先勾選要刪除的資料!!');
        }
        else {
            me.delMessage = "確定刪除勾選的資料嗎?";
            Ext.Msg.confirm('提醒', me.delMessage, callBackFunc);
            function callBackFunc(id) {
                if (id == 'yes') {
                    console.log("cur_recs.length:", cur_recs.length);
                    var gridstore = Ext.getCmp('grid_Single').store;                        
                    for (let i = 0; i <= cur_recs.length - 1; i++) {
                        console.log("i:", i);
           Ext.getCmp('grid_Single').getSelectionModel().select(cur_recs[i]); //grid select指向所選的資料
                        if (Ext.getCmp('btn_del').afterDel() == false) {
                            return;
                        }                                                
                    } //  end of for (let i=0,)
                    //資料庫均刪除完成後, 才由 gridstore 移除資料
                    for (let i = 0; i <= cur_recs.length - 1; i++) {
                        gridstore.remove(cur_recs[i]); //畫面上隱藏刪除列                     
                    } //  end of for (let i=0,)
                    Ext.getCmp('grid_Single').getView().refresh();
                    buttonModel.modelType = 0;
                }  // end    if (id == 'yes')             
            }  // end of callbackfunc
        }  //else { of if length>0            
    } ) // end of click function 

2022年9月2日 星期五

V20306 - 若Template Grid畫面有 CheckBoxModel ,則判斷選擇資料會錯誤 - 移除 parent.onclick function -改用自定的 onclick

       目的: 若Grid畫面有 CheckBoxModel ,則判斷選擇資料會錯誤 , 

                 已勾選資料,但編輯時,仍會顯示"請先選擇一筆資料!! "

                  --> Template 的錯誤, 更  TMGrid.js  & TMSingleViewEdit.js 即可

處理說明: 方法1>將 parent 的 onclick 解除  Listener 

                              不呼叫 parent.onclick function , 只呼叫 child.onclick function

                              V20306 繼承自 TMSingleViewEdit class,  onClick時,會先呼叫 parent .onClick

                             (因 constructor: function (config){ ...   ;  this.callParent(config);}    ) 

                  方法2>置換 V20306.grid_Single 元件,將 grid.SelModel 改成 checkboxModel 





1>方法一:   *.js   移除 parent .onclick function  - 改用自定的 onclick   

//兩種方法均可  - un("click",handlerFn)   - removeEventListener("click", handlerFn);
Ext.getCmp('btn_edit').un("click", Ext.getCmp('btn_edit').events.click.listeners[0].fn);
//Ext.getCmp('btn_edit').removeEventListener("click", Ext.getCmp('btn_edit').events.click.listeners[0].fn);        

Ext.getCmp('btn_edit').on("click", function (me, e, eOpts) {
        var sel_recs = Ext.getCmp('grid_Single').getView().getSelectionModel().getSelection();
if (sel_recs.length > 0) {
var sel_rec = sel_recs[0];
            setFormData(sel_recs);
            buttonModel.setModelType(2);
            Ext.getCmp("tab2").setDisabled(true);                              
            Ext.getCmp("TMSingleViewEdit").setActiveTab("tab1");
}
 else {
            mywarnalert("請先選擇一筆資料 !!");
        }

        setFieldsCls('myform', ['ASPNO', 'LCNO', 'MCNM', 'ORDID', 'PCTP', 'FICNMA', 'STLCT', 'PCQTY', 'LRULT', 'LRUWT', 'LRUHG'], ['ASPNO'],['ASPNO','RPNOAF','LCNO','LRWET','MCNM','ASPSTA','ORDID','PCTP','FICNMA','STLCT','PCQTY','ASLV','ASPRMK','NGONOAF','PN','LCITM','LCETDT','LCCHID','LCORAO','LRULT','LRUWT','LRUHG','WTLV','ITPR']);
        showFormButton('myform', ['btn_RPNOAF', 'btn_LRWET', 'btn_MCNM', 'btn_ASPSTA', 'btn_ORDID', 'btn_PCTP', 'btn_FICNMA', 'btn_STLCT', 'btn_ASPRMK', 'btn_NGONOAF', 'btn_PN', 'btn_LCCHID']);
        return false;
    });


方法2:  置換 selModel 成  Ext.selection.CheckboxModel
              另外Template   TMGrid.js  & TMSingleViewEdit.js   也要換成最新版本

Ext.onReady(function () {
    var TMSingleViewEdit = Ext.create('TMSingleViewEdit');
    
    Ext.getCmp('grid_Single').destroy(); //20220905
    var grid_Single = Ext.create('grid_Single', {
        id: 'grid_Single',
        resizable: true,
        selModel: Ext.create('Ext.selection.CheckboxModel', {
            selectionMode: 'SIMPLE',
            listeners: {
                /*selectionchange: function (cb, selected, eOpts) {
                    //view.selModel.getSelection()
                },*/
                RowMouseDown: function (view, record, item, index, e) {
                    var me = this;
                    if (index !== -1) {

                        if (!me.allowRightMouseSelection(e)) {
                            return;
                        }

                        if (e.shiftKey && me.lastFocused) {
                            me.selectRange(me.lastFocused, record, e.ctrlKey);
                            me.processSelection(view, record, item, index, e);
                        }

                        if (!me.isSelected(record)) {
                            me.mousedownAction = true;
                            me.processSelection(view, record, item, index, e);
                        } else {
                            me.mousedownAction = false;
                        }
                    }

                }
            }
        })
    });
    Ext.getCmp('tab2').add(grid_Single); //將grid加入到tab裡面
    Ext.getCmp('tab2').updateLayout();


2022年8月16日 星期二

V120402- V120402C - 子畫面查詢grid 採用 CheckboxModel- checkbox 方式選擇 row, 處理勾選資料

目的: grid 畫面新增 CheckboxModel 選擇 row

處理說明:  1> var view = sub_Grid.getView();
                         view.selModel = Ext.create('Ext.selection.CheckboxModel', {
                         selectionMode: 'SIMPLE',
                            : 
                          };
                         view.updateLayout();
                   2>selectionMode:
      • SINGLE表示單選
      • SIMPLEMULTI表示多選 , 預設是多選的(如上段程式碼已經有設定單選
                   3>處理勾選的資料
                      //檢查資料是否正確
                        cur_recs = Tmp_sub_Grid.getView().selModel.getSelection();
                        console.log("cur_recs:", cur_recs);
                         if (cur_recs.length == 0) {
                              mywarnalert("請先選擇要續借的資料");
                              return;
                         }
                         for (var i = 0; i < cur_recs.length; i++) {


1>V120402C.js

 var view = sub_Grid.getView();
    view.selModel = Ext.create('Ext.selection.CheckboxModel', {
        selectionMode: 'SIMPLE',
        listeners: {
            selectionchange: function (cb, selected, eOpts) {
                console.log(view.selModel.getSelection()); //選取的值
                //console.log("selected.data[TMNO]", selected.data["TMNO"]);
            },
            RowMouseDown: function (view, record, item, index, e) {
                var me = this;
                if (index !== -1) {

                    if (!me.allowRightMouseSelection(e)) {
                        return;
                    }

                    if (e.shiftKey && me.lastFocused) {
                        me.selectRange(me.lastFocused, record, e.ctrlKey);
                        me.processSelection(view, record, item, index, e);
                    }

                    if (!me.isSelected(record)) {
                        me.mousedownAction = true;
                        me.processSelection(view, record, item, index, e);
                    } else {
                        me.mousedownAction = false;
                    }
                }

            }
        }
    });
    view.updateLayout();


2>checkbox 勾選資料s 的處理  - [續借]鈕

//檢查資料是否正確
    cur_recs = Tmp_sub_Grid.getView().selModel.getSelection();
    console.log("cur_recs:", cur_recs);
    if (cur_recs.length == 0) {
        mywarnalert("請先選擇要續借的資料");
        return;
    }
    for (var i = 0; i < cur_recs.length; i++) {
        cur_rec = cur_recs[i];
        Tmp_Str = "第" + (i + 1).toString() + "筆選擇 -條碼編號(" + cur_rec.data["TMNO"] + ")";
        //console.log(Tmp_Str, cur_rec.data["CHECK"]);
        //if ((cur_rec.data["CHECK"] == undefined) || (cur_rec.data["CHECK"] == false))
        //continue;
        Tmp_TMNO = cur_rec.data["TMNO"];
        Tmp_BRDT = cur_rec.data["BRDT"];
        Tmp_BRDAY = cur_rec.data["BRDAY"];
        if (Tmp_BRDAY >=20) {
            Tmp_Str = "第" + (i + 1).toString() + "筆條碼編號(" + Tmp_TMNO + ")已續借展延10天<br>"
                + "不可再展延<br>"
                +"請檢核<br>";
            mywarnalert(Tmp_Str);
            //cur_rec.data["CHECK"].setValue(false);
            //console.log("Ext.getCmp(Tmp_TMNO)", Ext.getCmp(Tmp_TMNO));
            isOk = false;            
            break;
        }
    }// for i=0
    if (isOk == false)
        return false;



如上為 子畫面,單純 Grid , 不套用 Template
PS: 若為 Template of   grid_Single or grid_M 正式處理方式 : 將 TMGrid 換掉 
    Ext.getCmp('grid_Single').destroy(); //20220905
    var grid_Single = Ext.create('grid_Single', {
        id: 'grid_Single',
        resizable: true,
        selModel: Ext.create('Ext.selection.CheckboxModel', {
            selectionMode: 'SIMPLE',
            listeners: {
                /*selectionchange: function (cb, selected, eOpts) {
                    //view.selModel.getSelection()
                },*/
                RowMouseDown: function (view, record, item, index, e) {
                    var me = this;
                    if (index !== -1) {

                        if (!me.allowRightMouseSelection(e)) {
                            return;
                        }

                        if (e.shiftKey && me.lastFocused) {
                            me.selectRange(me.lastFocused, record, e.ctrlKey);
                            me.processSelection(view, record, item, index, e);
                        }

                        if (!me.isSelected(record)) {
                            me.mousedownAction = true;
                            me.processSelection(view, record, item, index, e);
                        } else {
                            me.mousedownAction = false;
                        }
                    }

                }
            }
        })
    });
    Ext.getCmp('tab2').add(grid_Single); //將grid加入到tab裡面
    Ext.getCmp('tab2').updateLayout();