为了使DataGrid在 postback(提交表单)后保留列宽度,我们需要在 DataGrid 的 ItemDataBound 事件中存储列宽度,并在每个 postback 之后将其重新应用。
首先,在 DataGrid 的 ItemDataBound 事件中,我们可以使用 JavaScript 将列宽度存储在 cookie 中,以便在 postback 之后可以检索。
protected void grid_ItemDataBound(object sender, DataGridItemEventArgs e)
{
if (e.Item.ItemType == ListItemType.Header)
{
for (int i = 0; i < e.Item.Cells.Count; i++)
{
e.Item.Cells[i].Attributes.Add("onclick",
"storeColumnWidths('" + e.Item.ClientID + "','" +
e.Item.Cells[i].ClientID + "')"
);
}
}
}
然后,在 master page 或网页的 Page_Load 事件中,我们可以检查是否存在 cookie 以存储之前的列宽度,并在 DataGrid 初始化时应用这些值。
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
HttpCookie cookie = Request.Cookies["ColumnWidths"];
if (cookie != null)
{
string[] widths = cookie["Widths"].Split(new char[] { ',' });
for (int i = 0; i < widths.Length; i++)
{
if (i < grid.Columns.Count)
{
grid.Columns[i].ItemStyle.Width = Unit.Parse(widths[i]);
grid.Columns[i].HeaderStyle.Width = Unit.Parse(widths[i]);
}
}
}
}
}
protected void grid_Init(object sender, EventArgs e)
{
HttpCookie cookie = Request.Cookies["ColumnWidths"];
if (cookie != null)
{
string[] widths = cookie["Widths"].Split(new char[] { ',' });
for (int i = 0; i < widths.Length; i++)
{
if (i < grid.Columns.Count)
{
grid.Columns[i].ItemStyle.Width = Unit.Parse(widths[i]);
grid.Columns[i].HeaderStyle.Width = Unit.Parse(widths[i]);
}
}
}
}
最后,在每个 postback 之后,我们需要将列宽度存储在 cookie 中,以便在下一个 postback 时可以应用它们。
protected void Page_PreRender(object sender, EventArgs e)
{
HttpCookie cookie = new HttpCookie("ColumnWidths");
string widths = "";
foreach (DataGridColumn column in