默认情况下,当列和网格本身没有指定宽度时,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');
}
}
上面要求有一个 id 为“textWidthChecker”的跨度,以便使用与字体网格标题相同的 CSS 类来工作:
<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>
如果您使用的是行选择器,则需要在我提供的逻辑中更新计算以考虑行选择器。