2015-10-16 122 views
0

我有一个asp.net GridView,并在其中包含一些BoundFields。从代码中动态改变BoundField中的属性

<asp:BoundField ReadOnly="True" HeaderText="ID" DataField="ID" SortExpression="ID"></asp:BoundField> 
<asp:BoundField ReadOnly="True" HeaderText="Description" DataField="description" ItemStyle-Wrap="true" ItemStyle-Width="300px" SortExpression="ID"></asp:BoundField> 

说明字段中的文本可以是任何长度的,所以现在我已经设置了列只是300像素宽,并在必要时自动换行。

但我想实现的宽度是自动设置的位置,就像在正常的BoundField 直到它达到300px的宽度。之后,我希望它环绕。

我想在DataBound事件期间试图实现这一点,我可以在这里查看添加到表中的每个字符串的长度。如果达到一定的长度,我会将ItemStyle-Width属性添加到BoundField。

问题是BoundFields没有给出ID,所以我不能在后面的代码中改变属性的常规方式。我想通过浏览GridView的ID可以获得这些属性,但我不确定在哪里添加属性。

+0

我认为用CSS管理更好。 – CurseStacker

+0

@CurseStacker,我将如何去给那个BoundField一个正确的CSS类或样式标记?再次,我无法通过ID访问它。也许我可以给它一个自定义的类,并从后面的代码中更改样式表上的内容?简单看看谷歌后,我不认为我可以从后面的代码编辑样式表。 – G3n0c1de

回答

2

我想通了。

我最终使用文本的字体和大小来测量字符串的宽度。

我发现了一个特别有用的链接here。辅助类使得生成SizeF对象变得容易。我制作了一个名为width300px的自定义CSS类width: 300px

这里是我的背后代码:

protected void myGridViewRowDataBound(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e) 
{ 

    if (e.Row.RowType == DataControlRowType.DataRow) 
    { 

     Font stringFont = new Font("Times New Roman", 12); 
     SizeF stringSize = new SizeF(); 
     string description = e.Row.Cells[1].Text; 

     stringSize = GraphicsHelper.MeasureString(description, stringFont); 

     if (stringSize.Width > 300) 
     { 

      gridViewWallsList.Columns[2].ItemStyle.CssClass = "width300px"; 

     } 

    } 

} 

最重要的部分在塔的ItemStyle财产得到。如果没有ID,我必须记得更改列索引,如果我在它之前添加更多的列,但这是有效的。