2013-11-15 45 views
7

私の究極の目標は、jqgridにデータの内容に応じて列の幅を自動設定することです。そこに行く道の一環として、データがロードされた後で列幅を設定できるようにする必要があります。これは各列の最大幅を知る時間です。しかし、一度、列の最大幅を知ったら、 "loadComplete"イベントで各列の幅を設定し、グリッドを各列の新しい幅でリフレッシュさせるにはどうすればよいですか?ネット上で見つかったほとんどの投稿は、グリッドの全体的な幅に関するものです。私が欲しいのは、各列の幅を設定し、幅が長すぎると自動的に水平スクロールバーを表示させることです。データがロードされた後にjqgridの列幅を調整する方法は?

アップデート:Olegの素晴らしいデモを見て、私はdqGrid(4.5.4)自体でこれをコーディングしました。ここに私がやったことだ:

は、

addJSONData = function(data,t, rcnt, more, adjust) { 

は、右この関数の最後}前

  for (j=0;j<rowReader.length;j++) { 
       v = $.jgrid.getAccessor(cur,rowReader[j]); 
       rd[ts.p.colModel[j+gi+si+ni].name] = v; 
       rowData.push(addCell(idr, v, j + gi + si + ni, i + rcnt, cur, rd)); 

       // my addtion: stores the largest header size 
       var newWidth = v.length * 6; 
       if (ts.grid.headers[j].width < newWidth) { 
        ts.grid.headers[j].width = newWidth; 
       } 
      } 

次に、この関数内で見つける機能を見つけて追加し、次の

 // my addition: invoke the resizing logic 
     for (j = 0; j < rowReader.length; j++) { 
      ts.grid.resizing = { idx: j }; 
      ts.grid.dragEnd(); 
     } 

その後、グリッドは内容に応じて各列の幅を調整します。私がまだ助けが必要なことの1つは、新しい幅を貴重に計算する方法です。私の現在のハードコード化された計算

VAR newWidth = v.length * 6。

は明らかにあまりスケーラビリティがありません。あなたの質問に

+0

あなたの質問では、[受け入れる](http://meta.stackexchange.com/a/5235/147495)回答が始まるとよいでしょう。 – Oleg

答えて

17

短い答えは次のようになります。jqGridは、グリッドが作成した後、列の幅を変更することができます何の方法を提供しません。そのような場合、私はよく知られている暗記を思い起こさせるKozma Prutkov:「誰が火薬を防水するのを防ぎますか?」それは次のことを意味します:何かが存在しなければ、それはまだ発明されています。そこで私はthe answerで提案されている解決策に基づいてそのようなメソッドを書いていましたが、グリッドの列のサイズを変更するために内部メソッドdragEndを呼び出すことを提案しました。

The demoは、新しいメソッドの使用法を示します。デモでは、指定したグリッドのいくつかの列を選択し、その後、新しい値に幅を変更することができます:

enter image description here

あなたは

$.jgrid.extend({ 
    setColWidth: function (iCol, newWidth, adjustGridWidth) { 
     return this.each(function() { 
      var $self = $(this), grid = this.grid, p = this.p, colName, colModel = p.colModel, i, nCol; 
      if (typeof iCol === "string") { 
       // the first parametrer is column name instead of index 
       colName = iCol; 
       for (i = 0, nCol = colModel.length; i < nCol; i++) { 
        if (colModel[i].name === colName) { 
         iCol = i; 
         break; 
        } 
       } 
       if (i >= nCol) { 
        return; // error: non-existing column name specified as the first parameter 
       } 
      } else if (typeof iCol !== "number") { 
       return; // error: wrong parameters 
      } 
      grid.resizing = { idx: iCol }; 
      grid.headers[iCol].newWidth = newWidth; 
      grid.newWidth = p.tblwidth + newWidth - grid.headers[iCol].width; 
      grid.dragEnd(); // adjust column width 
      if (adjustGridWidth !== false) { 
       $self.jqGrid("setGridWidth", grid.newWidth, false); // adjust grid width too 
      } 
     }); 
    } 
}); 

下記のことができます見つけることができる新しい方法のコードプロジェクトにメソッドを含めてから setColWidthメソッドを使用してください。メソッドの最初のパラメータは、列インデックスまたは列名のいずれかです。 2番目のパラメータは、列の幅の新しい値を指定する数値です。 3番目のパラメータはオプションです。指定されていない場合、グリッドの幅は自動的に調整され、列幅の変更に対応します。したがって、列の幅を変更する前にグリッドにスクロールバーがない場合は、グリッドにはスクロールバーがありません。元のグリッド幅を保持する場合は、 setColWidthメソッドの3番目のパラメータとして falseを指定する必要があります。

更新日:最新の(更新された)バージョンsetColWidthは、githubからダウンロードできます。現在hereを開発している新しい無料のバージョンのjqGridには、jqGridの基本モジュールと同じ方法が含まれています。したがってjquery.jqGrid.min.jsjquery.jqGrid.min.mapおよびjquery.jqGrid.src.jsをここから使用する場合は、jQuery.jqGrid.autoWidthColumns.jssetColWidthをプラグインとして含める必要はありません。 2 UPDATED

を私はgithubに公開setColWidthの最新バージョンに対応するために上記のコードを変更しました。

更新3:方法setColWidthは、私は2014年の終わりにはそれはの内容の幅に基づいて、カラムの幅を拡張するような他の多くの新機能を備えているので開発jqGridのfree jqGridフォークに含まれカラム。詳細については、the wiki articleを参照してください。

+0

クールなデモをありがとう。私がやったことに私の "更新"を見てください。返さなければならないピクセル単位の正確な幅を計算する方法に関するアイデアはありますか? – dreamfly

+0

@dreamfly:ようこそ!私はちょっと奇妙な "更新"を見つける。まずは**新しい質問です**(元は "データがロードされた後にjqGridの列幅を調整する方法でした")。秒実際に必要な場合は、jqGridのソースコードを変更することはお勧めしません。代わりに 'loadComplete'や' beforeProcessing'を使うことができます。今あなたの主な質問について:私は ' ...'の中にセルの内容をラップすることができると思います。その後、 'jQuery.width'を使用してピクセル内の正確な幅を ''というように計算し、セル内のすべてのテキストを計算することができます。最後に 'setColWidth'を使うことができます。 – Oleg

+0

私は、ソースコードの変更の落とし穴を十分に認識しています。これは私の意見でこれを実装するのがどれほど単純ではあるが非常に便利な機能であるかという概念の証明に過ぎません。特にシンプルなHTMLテーブルはそれをネイティブに行います。もちろん、データを再処理せずに効率も達成されました。 – dreamfly

関連する問題