根据列宽动态设置页眉宽度

本文关键字:设置 动态 | 更新日期: 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表相同的表,并根据单元格中的字符数分配了宽度。