0

カスタムボタンを一列に並べたシンプルなテーブルを作りたい。ボタンを押すと、「アラート」ボックスが表示されます。私はこれに関するいくつかの投稿を読みました。たとえば、 この投稿この他の投稿ですが、コードが機能しない理由がわかりません。ボタンは描画されますが、押しても効果はありません。

ここで説明する3つの試みがあります。

バージョン1。ボタンのクリックは発生しません。

  $(document).ready(function(){
      jQuery("#simpletable").jqGrid({
         datatype: "local",
        colNames:['A','B','Status'],
        colModel:[
        {name:'A',index:'A'},
        {name:'B',index:'B'},
        {name:'status',index:status}
    ],
        data:[ 
        {'A':2,'B':100,'status':"<button  onclick=\"jQuery('#simpletable').saveRow('1', function(){alert('you are in')});\" >in</button>"},
        {'A':1,'B':200,'status':"<button onclick=\"jQuery('#simpletable').saveRow('2', function(){alert('you are in')});\" >in</button>"},
        ],
        caption: "Demo of Custom Clickable Button in Row",
        viewrecords:true,
        editurl:'clientArray',
    });

   });

HTMLコード:

<table id="simpletable"></table>

編集8/2/12-最初の投稿からいくつかのことを学びました。ここでは、さらに2つの試みについて説明します。

バージョン2:onCellSelectを使用しています。これは機能しますが、セルに複数のボタンを配置することはできません。さらに、この投稿へのコメントの1つで提案されているフォーマットオプションを使用して、コードをより適切に作成しました。

function status_button_maker_v2(cellvalue, options, rowObject){
    return "<button class=\"ver2_statusbutton\">"+cellvalue+"</button>"
};

jQuery("#simpletablev2").jqGrid({
    datatype: "local",
    colNames:['A','B','Status'],
    colModel:[
    {name:'A',index:'A'},
    {name:'B',index:'B'},
    {name:'status',index:status,editable:true,formatter:status_button_maker_v2}
    ],
        data:[ 
    {'A':2,'B':100,'status':"In"},
    {'A':1,'B':200,'status':"Out"}
        ],

    onCellSelect:function(rowid,icol,cellcontent,e){
    if (icol==2){

        alert('My value in column A is: '+$("#simpletablev2").getRowData(rowid)['A']);
    }else{
        return true;
    }
    },

    caption: "Demo of Custom Clickable Button in Row, ver 2",
    viewrecords:true,
});  //end simpletablev2

マークアップ:

<style>.ver2_statusbutton { color:blue;} </style>
<h3>simple table, ver 2:</h3>
<table id="simpletablev2"></table>

バージョン3:非推奨の「.live」の代わりに「.on」を使用して、w4ikの投稿のソリューションを使用しようとしました。これによりボタンクリックが発生しますが、ROWIDを取得する方法がわかりません。w4ikもこれに苦労し、彼はそれを解決したと投稿しましたが、彼はそれをどのように行ったかではありませんでした。最後の行を選択できますが、ボタンが優先されるため、これは常に前の行を参照します。

私はそれを機能させることができれば、このソリューションを好むでしょう。

jQuery("#simpletablev3").jqGrid({
    datatype: "local",
    colNames:['A','B','Status'],
    colModel:[
    {name:'A',index:'A'},
    {name:'B',index:'B'},
    {name:'status',index:status,editable:true,formatter:status_button_maker_v3}
    ],
        data:[ 
    {'A':2,'B':100,'status':"In"},
    {'A':1,'B':200,'status':"Out"}
        ],
    caption: "Demo of Custom Clickable Button in Row, ver 3",
    viewrecords:true,
    onSelectRow: function(){},
    gridComplete: function(){}
});  //end simpletablev3


$(".ver3_statusbutton").on(
    {
    click: function(){
        //how to get the row id?  the following does not work
        //var rowid = $("#simpletablev3").attr('rowid'); 
        //
        //it also does not work to get the selected row
        //   this is always one click behind:
        //$("#simpletablev3").trigger("reloadGrid");
        rowid = $("#simpletablev3").getGridParam('selrow');
        alert("button pushed! rowid = "+rowid);
    }
    });

マークアップ:

 <style>.ver3_statusbutton {    color:red;} </style>
 <h3>simple table, ver 3:</h3>
 <table id="simpletablev3"></table>

要約すると、適切なタイミングでボタンを押すという問題に苦労しています。バージョン1では、行が選択され、ボタンが押されることはありません。バージョン2は、「ボタン」をまったく使用しません。セルのクリックを処理するだけです。Verion 3は、行を選択する前にボタンをクリックします(順序が間違っています)。

どんな助けでもいただければ幸いです!

4

1 に答える 1

4

ここで各行でアクションフォーマッターを使用し、次のようなformatOptionsで編集および削除ボタンをfalseにすることができます。

formatoptions: {editbutton:false,delbutton:false}}

そして、次の2つのデモに従ってください。

http://www.ok-soft-gmbh.com/jqGrid/Admin3.htm

http://ok-soft-gmbh.com/jqGrid/TestSamle/Admin1.htm

そして、これらのカスタムボタンのクリックイベントでアラートを表示します。

編集

var getColumnIndexByName = function (grid, columnName) {

                var cm = grid.jqGrid('getGridParam', 'colModel'), i, l = cm.length;

                for (i = 0; i < l; i++) {

                    if (cm[i].name === columnName) {

                        return i; // return the index

                    }

                }

                return -1;

            },

function () {

                var iCol = getColumnIndexByName(grid, 'act');

                $(this).find(">tbody>tr.jqgrow>td:nth-child(" + (iCol + 1) + ")")

                    .each(function() {

                        $("<div>", {

                            title: "Custom",

                            mouseover: function() {

                                $(this).addClass('ui-state-hover');

                            },

                            mouseout: function() {

                                $(this).removeClass('ui-state-hover');

                            },

                            click: function(e) {

                                alert("'Custom' button is clicked in the rowis="+

                                    $(e.target).closest("tr.jqgrow").attr("id") +" !");

                            }

                        }

                      ).css({"margin-right": "5px", float: "left", cursor: "pointer"})

                       .addClass("ui-pg-div ui-inline-custom")

                       .append('<span class="ui-icon ui-icon-document"></span>')

                       .prependTo($(this).children("div"));

                });

            }

このコードをチェックすると、列名を「act」として指定してインデックス値を見つけようとしています。別の列名を指定すると、他の列のインデックスを取得できます。

var iCol = getColumnIndexByName(grid, 'Demo'); and the rest of the code will be same for you. //demo is the column name where u want to add custom button

このボタンのクリックイベントを記述します。

これがうまくいくかどうか教えてください。

于 2012-07-31T16:23:52.973 に答える