根据列宽动态设置页眉宽度
本文关键字:设置 动态 | 更新日期: 2023-09-27 18:20:39
我创建了一个带有浮动标题的网格视图,当我滚动时,该标题会保持不变,但是网格视图是动态生成的,标题和列会自动适应内容。因为标题是与内容分开浮动的,它的宽度与网格视图中的列不同,而且它是动态生成的,所以我不想分配预定义的宽度。我试图通过c#获得网格视图第一行中每列的宽度,并设置每列的标题宽度以匹配它。现在我正在尝试:
<asp:GridView CssClass="Grid" ID="gv" runat="server" OnRowDataBound="gridViewDataBind">
带有c#
protected void gridViewDataBind(object sender, GridViewRowEventArgs e)
{
for (int c = 0; c < e.Row.Cells.Count; c++)
{
}
if (e.Row.RowType == DataControlRowType.DataRow)
{
for (int i = 0; i < e.Row.Cells.Count; i++)
{
int maxWidth = 0;
//iterate through each cell in the row
//this loop will search for the widest cell
if (e.Row.Cells[i].Text.Length > maxWidth)
{
maxWidth = e.Row.Cells[i].Text.Length;
//update the header cell to match the maxWidth found
//I multiplied by 10 to give it some length
Unit u_maxWidth = Unit.Parse((maxWidth * 16).ToString());
gv.HeaderRow.Cells[i].Width = u_maxWidth;
e.Row.Cells[i].Width = u_maxWidth;
}
if ((gv.HeaderRow.Cells[i].Text.Length) > maxWidth)
{
maxWidth = gv.HeaderRow.Cells[i].Text.Length;
//update the header cell to match the maxWidth found
//I multiplied by 10 to give it some length
Unit u_maxWidth = Unit.Parse((maxWidth * 16).ToString());
gv.HeaderRow.Cells[i].Width = u_maxWidth;
gv.Columns[i].ItemStyle.Width = u_maxWidth;
}
}
}
}
编辑:现在是设置宽度,但是设置单元格宽度并不能给我想要的结果。当我尝试设置列宽时,我得到一个错误,它比集合大,因为没有其他列有宽度。
编辑既然我们不能得到单位宽度,那就强制它。我们知道数据正在进来,并且有数据的长度。根据您使用的字体系列,您可以通过这种方式进行操作。我使用了两个对象的样本数据。
将RowDataBound事件外的int maxWidth移到类作用域中,否则每次填充一行时它都会重置。
private int maxWidth = 0;
更新DataRow条件语句如下:
if (e.Row.RowType == DataControlRowType.DataRow)
{
log.Debug("Found a datarow");
for (int i = 0; i < e.Row.Cells.Count; i++)
{
log.Debug(String.Format("Row.Cell length : {0} || maxWidth : {1}", e.Row.Cells[i].Text.Length, maxWidth));
//iterate through each cell in the row
//this loop will search for the widest cell
if (e.Row.Cells[i].Text.Length > maxWidth)
{
maxWidth = e.Row.Cells[i].Text.Length;
log.Debug(String.Format("maxWidth is now : {0}", maxWidth));
//update the header cell to match the maxWidth found
//I multiplied by 10 to give it some length
Unit u_maxWidth = Unit.Parse((maxWidth * fontFamilyFactor).ToString());
log.Debug(String.Format("u_maxWidth is now : {0}", u_maxWidth));
gv.HeaderRow.Cells[i].Width = u_maxWidth;
}
}
}
我使用log4net作为我的调试器。以下是我运行的带有示例数据的日志文件的输出:
Found a datarow
Row.Cell length : 0 || maxWidth : 0
Row.Cell length : 7 || maxWidth : 0
maxWidth is now : 7
u_maxWidth is now : 70px
Row.Cell length : 13 || maxWidth : 7
maxWidth is now : 13
u_maxWidth is now : 130px
Row.Cell length : 0 || maxWidth : 13
Row.Cell length : 12 || maxWidth : 13
Row.Cell length : 0 || maxWidth : 13
Found a datarow
Row.Cell length : 0 || maxWidth : 13
Row.Cell length : 3 || maxWidth : 13
Row.Cell length : 13 || maxWidth : 13
Row.Cell length : 0 || maxWidth : 13
Row.Cell length : 12 || maxWidth : 13
Row.Cell length : 0 || maxWidth : 13
Row.Cell length : 0 || maxWidth : 13
我发现的问题是,由于必须启用自动生成列,因此生成的列的"宽度"为空,并自动适应单元格的内容。我无法填充宽度,因为它会比在渲染之前没有宽度的表宽。由于我无法在渲染表后自动调用方法,因此无法使用该方法应用宽度。
最终,我使用文字控制生成了与HTML表相同的表,并根据单元格中的字符数分配了宽度。