0

localArray データで jqGrid を使用しています。この配列を紺碧のデータベースから取得し、グリッドにビンジングしています。この後、すべての行を操作して、DBで更新する予定です。

インライン ナビゲーション バーを使用しています。「行の追加」、「行の保存」、「行の削除」ボタンをクリックすると、カスタム関数を呼び出して、その関数から DB にデータを保存/削除したいと考えています。

まず、私のデザインが正しく、スケーラブルかどうかを知りたいです。

現在、「aftersavefunc」パラメーターを使用して、保存ボタンのクリック時にカスタム関数を呼び出すことができます。

次に、「行の削除」ボタンに設定する必要があるパラメーターを教えてください。「行の追加」の場合、「行の保存」ボタンをクリックして行を保存する必要があるため、同じパラメーターが機能すると思います。

私のコードは参考のために以下の通りです:

jQuery("#list4").jqGrid({
    datatype: "local",
    data: myData,
    height: "auto",
    colNames: ['RowNo', 'RouteId', 'Area'],
    colModel: [
        { name: 'id', index: 'id', width: 50, sortable: false },
        { name: 'RouteId', index: 'RouteId', width: 50, sortable: false },
        { name: 'Area', index: 'Area', width: 130, sortable: false, editable: true, editrules: { required: true} },
    ],
    multiselect: false,
    rownumbers: false,
    rowList: [10, 20, 30],
    pager: jQuery('#pager1'),
    viewrecords: true,
    caption: "Bus Schedule Data",
    editurl: "clientArray",
    restoreAfterSelect: false,
    loadonce: true
});
var rowid;
var inlineparams = {
    addParams: { useFormatter: false },
    editParams: {
        aftersavefunc: function (id) {
            var rowData = jQuery('#list4').jqGrid('getRowData', id);
            ScheduleTable.update({ id: 1, Area: rowData.Area.toString() });
        }
    },
    add: true,
    edit: true,
    save: true,
    cancel: true,
    del: true
};

jQuery("#list4").jqGrid('navGrid', "#pager1", { edit: false, save: false, add: false, cancel: false, del: false });
jQuery("#list4").jqGrid('inlineNav', "#pager1", inlineparams);
jQuery("#list4").jqGrid("saveRow", id, {
    keys: false,
    url: "clientArray"
});
4

1 に答える 1

2

inlineNavメソッドには、使用するオプションdelがありません ( を参照inlineparams)。フォーム編集で削除ボタンを実装するには、削除del: falseオプションを使用する必要があります ( delGridRowメソッドを参照)。navGrid

私は個人的に、データベース内のデータを保存するインライン編集の使用法がaftersavefunc最善の方法ではないことを発見しました。グリッド内の変更は最初にローカルに保存され、次にデータベース内のデータを更新しようとするため、このようなアプローチを使用してエラー処理を実装すると問題が発生します。保存中に何らかのエラー (検証エラー、同時実行エラーなど) が発生した場合は、グリッド内のデータの以前の状態を復元する必要があります。そのため、以前の状態を (oneditfuncたとえば、コールバック内で) 保存してから、必要に応じて古いデータを復元する必要があります。

そのため、設計の観点から、元の Ajax ベースのバージョンに変更することをお勧めしdatatype: "local"ますediturl: "clientArray"

jqGrid を提案する標準的な方法を使用する場合は、Ajax ごとにサーバーと通信できます。バックエンドがエラーの説明を返す可能性がある場合、ユーザーは現在の編集データを変更して、そこに再度保存を試みることができます。必要なのは、いくつかのサーバー コンポーネント (ASP.NET Web API サービス、ASP.NET WCF サービス、ASP.NET MVC コントローラー、ASMX WebServiceASHX ハンドラーなど) を実装することだけです。Windows Azure では、すべてのテクノロジ (ASMX WebService や ASHX ハンドラなどの最も古いテクノロジも含む) を使用できます。

元の方法に従うことにした場合は、フォーム編集を使用して削除を実装できます。の場合の実装方法は、もともとここで説明しましたediturl: "clientArray"回答では、フォーム編集操作の完全なセットをローカル データで使用する方法を投稿しました。別の回答には、jqGrid の現在のバージョン (4.4.1 および 4.4.4) で動作する更新されたコードが含まれています。最後の回答delSettingsから使用することをお勧めします。データのローカル保存に必要なすべての処理のコールバック。onclickSubmitdelSettings

あなたのコードによくある小さな注意事項:

  • 1 つのグリッドでidとの両方を使用するのは奇妙だと思います。RouteIdおそらくidまったく必要ありません。あなたのケースでデータベースから本当に一意である場合はkey: true、追加のプロパティとして追加できますRouteIdid
  • index使用する値はプロパティの値と同じであるため、すべての列からプロパティを削除できnameます。
  • その(または)からsortable: false(または両方width: 50sortable: false)を削除しcolModelて、代わりに使用できます。詳しくはこちらをご覧ください。cmTemplate: {sortable: false}cmTemplate: {width: 50, sortable: false}
  • multiselect: falserownumbers: falseおよびrestoreAfterSelect: falsejqGrid のオプションを削除できます。最初の 2 つにはデフォルト値があります (オプションのリストを含む表の「Default1」列を参照)。最後のオプション ( restoreAfterSelect: false) は のオプションであるinlineNavため、必要に応じて の中で使用する必要がありinlineparamsます。
  • に置き換える必要pager: jQuery('#pager1')がありpager: '#pager1'ます。jqGrid にはpagerID セレクターが必要です。別のフォーム jqGrid で入力パラメータを指定すると、エラーが検出され、#pager1
  • gridview: trueすべてのグリッドでオプションを使用して、他の欠点なしでパフォーマンスを向上させることをお勧めします(詳細については、回答を参照してください) 。
于 2013-04-06T11:39:10.643 に答える