デフォルトで、WebDataGrid は、列およびグリッド自体に幅が指定されていない場合、グリッドのコンテンツ領域をその内容に合わせてサイズ変更します。次に、ヘッダーのサイズがデータ部分に合わせられます。これは、グリッドがコンテナー内にあるかコンテナー外にあるかに関係なくうまく機能します。
グリッドのデータ部分のサイズが適切に設定されているため、グリッドの最初のセルの幅、またはヘッダー全体を表示するための測定値のいずれか大きい方に列のサイズを変更するだけです。次の JavaScript はこれを行います。
function resizeGrid(grid) {
var textWidthChecker = document.getElementById('textWidthChecker');
var columns = grid.get_columns();
var widths = new Array(columns.get_length());
var row = grid.get_rows().get_row(0);
var newGridWidth = 0;
for (var colIdx = 0; colIdx < columns.get_length(); colIdx++) {
var col = columns.get_column(colIdx);
textWidthChecker.innerHTML = col.get_headerText();
var cellElement = row.get_cell(colIdx)._element;
if (!col.get_hidden()) {
if (textWidthChecker.offsetWidth > cellElement.offsetWidth) {
// 8 for padding in header.
newGridWidth += textWidthChecker.offsetWidth + 8;
widths[colIdx] = textWidthChecker.offsetWidth + 8;
} else {
widths[colIdx] = cellElement.offsetWidth;
newGridWidth += cellElement.offsetWidth;
}
}
}
newGridWidth += columns.get_length() * 16; // added for padding on cells
var gridElement = grid.get_element();
gridElement.style.width = newGridWidth + 'px';
for (var colIdx = 0; colIdx < columns.get_length(); colIdx++) {
var col = columns.get_column(colIdx);
col.set_width(widths[colIdx] + 'px');
}
}
上記では、フォントのグリッドのヘッダーと同じ CSS クラスを使用してこれが機能するために、id が「textWidthChecker」のスパンが必要です。
<div style="height: 0px;overflow: hidden;" class="igg_HeaderCaption ig_Control">
<span id="textWidthChecker"></span>
</div>
このアプローチは、ヘッダーのサイズが変更されたときにグリッドに対して十分な幅のコンテナー内にグリッドがある限り、クライアント側の Initialize メソッドから resizeGrid 関数が呼び出されたときにうまく機能します。
グリッドがより小さいコンテナにある場合、WebDataGrid が内部で幅を設定し、これが列のサイズに影響するため、これは失敗します。これを回避するには、resizeGrid 関数を先に呼び出す必要がありますが、このためのイベントはありません。
具体的には、_initializeObjects と _adjustGridLayout の呼び出しの間のグリッドの初期化関数中に、resizeGrid を呼び出す必要があります。これを行うには、WebDataGrid のプロトタイプを変更して、_adjustGridLayout を、resizeGrid を呼び出して元の _adjustGridLayout を呼び出す別のものに置き換えることができます。
var adjustGridLayoutFunction = $IG.WebDataGrid.prototype._adjustGridLayout;
$IG.WebDataGrid.prototype._originalAdjustGridLayout = adjustGridLayoutFunction;
$IG.WebDataGrid.prototype._adjustGridLayout = function () {
resizeGrid(this);
this._originalAdjustGridLayout();
};
プロトタイプを変更すると、ページ上のすべてのグリッドに影響することに注意してください。これを適用するグリッドを制御したい場合は、新しい _adjustGridLayout 関数に条件付きロジックを追加する必要があります。例えば:
if (this.get_id() == "WebDataGrid1")
resizeGrid(this);
グリッド内でテキストが折り返されないようにするには、ItemStyle にも css を使用する必要があります。
.noWrapCellStyle {
white-space: nowrap;
}
これを機能させるには、グリッドのコンテナーに目的の幅を設定し、グリッドの幅を空のままにする必要があります。
<div style="width:300px;overflow: auto;">
<ig:WebDataGrid ID="WebDataGrid1" runat="server" Height="450px" AutoGenerateColumns="True" ItemCssClass="noWrapCellStyle">
</ig:WebDataGrid>
</div>
行セレクターを使用している場合は、行セレクターを説明するために提供しているロジックで計算を更新する必要があります。