GridView 表头如何换行? (例如共8字分两行,每行4字) 例如这样的场景: 其中一列的数据宽度是90px 左右, 所以列宽设为90px, 但是表头有八个字, 如果让它自动折行, 可能会第一行五个字, 第二行三个字, 很难看, 以前用datagrid 可以在第四个字后面加<br> 让它分两行, 可是gridview 似乎不支持这样做, 写上<br> 它就照原样显示了. 模板列我知道可以用模板控制, 想问一下绑定列怎么才能控制表头换行? 谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 哇 换行好难看的。不如查询的时候把字段substring()一下。 在加... 回二楼:老大, 这是不可能的... 我只是举这么例子, 大多数情况下, 不可能调到自己希望的宽度, 因为列宽取决于数据宽. 回三楼:<asp:BoundField HeaderText="一二三四五" HeaderStyle-Width="100px" DataField="test" ItemStyle-Wrap="false" />回四楼:如果你的数据只有一个数字, 而表头长达十个字, 而且这样的列有四五列, 你觉得换行难看, 还是不换行难看? 仍可以用<br>, 测试没有错误.<asp:BoundField HeaderText="一二<br/>三四五"/> xie_yanke:你用的是BoundField 吗? TemplateField 可以, 但是BoundField 我这边不行啊, 或者你把整个测试项目的文件发给我, [email protected] 谢谢. 呵呵,是可以的.我测试过了.<asp:GridView ID="gridList" runat="server"><Columns> <asp:BoundField HeaderText="a<br/>b" /></Columns></asp:GridView>如果你的不可以,那么你也可以这样:private void gridList_RowDataBound(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e){ if(e.Row.RowType==DataControlRowType.Header) { e.Row.Cells[0].Text = "a<br/>b"; }} TO xie_yanke :在RowDataBound 事件中我无论如何也不可能接受... 没效率可言了gridview 定义的地方的代码我当然也是知道怎么写的, 我现在怀疑你的环境配置可能和我的不一样, 导致不一样的结果, 例如web.config 或是其它的因素影响, 所以我想让你把整个项目发给我看一下. 另外, 我是用vs2008, 如果你用的是vs2005, 可能跟.net framework 的版本也有关系. 所以..还是麻烦你发一下吧, 谢谢. VS2008不太熟, 是不能使用<br/>, 但是, VS2008新增了HeaderRow, 可以在你绑定数据时, 进行格式化:<script runat="server"> private void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { ArrayList al = new ArrayList(); al.Add("a"); al.Add("a"); al.Add("a"); al.Add("a"); s.DataSource = al; s.DataBind(); foreach (TableCell o in s.HeaderRow.Cells) { o.Text = string.Format(o.Text, "<br/>"); } } }</script>.....<asp:GridView ID="s" runat="server"> <Columns> <asp:BoundField HeaderText="a{0}b" /> </Columns></asp:GridView>..... to xie_yanke :十分感谢!但是这个方法也让人很难满意, 首先, 即使只在page_load 里面做一次, 就很烦, 因为每个页面都需要把这几句拷过去, 感觉很累赘, 更何况, 一个页面不止需要做一次, 只要重新绑定数据, 就需要再做一遍, 只为实现这么点小功能. -_-## 呵呵,我对vs2008不太熟. 如果你认为你这个在大量的页面要用.如果没有更好的办法, 你可以做自定义控件.public class myGridView : GridView.....所有都不变, 只把HeaderRow 格式化一下,即可. 做自定义控件的话,又要在每个页面加Register 指令了, .... 唉, 真烦, 我再等等吧, 实在没有别的办法的话就结贴了. 你可以在WebConfig里加啊.<pages> <controls> <add .... /> <controls></pages>所有页面均可调用. 我的页面是从母版页继承的, 所以我希望能在母版页里处理掉, 下面两个函数是母版的, 虽然编译通过, 可惜不会执行gv1_DataBound, 有没有办法让母版页函数处理内容页的控件的事件? protected void Page_Load(object sender, EventArgs e) { var gv1 = ContentPlaceHolder1.FindControl("gv1") as System.Web.UI.WebControls.GridView; if (gv1 == null) return; gv1.DataBound += new EventHandler(gv1_DataBound); } void gv1_DataBound(object sender, EventArgs e) { var gv1=sender as GridView; foreach (TableCell cell in gv1.HeaderRow.Cells) { cell.Text = string.Format(cell.Text, "<br />"); } } 有了一个暂时的解决方案, 母版页中: public void Page_PreRender(object sender, EventArgs e) { var gv1 = ContentPlaceHolder1.FindControl("gv1") as System.Web.UI.WebControls.GridView; if (gv1 == null) return; foreach (TableCell cell in gv1.HeaderRow.Cells) { cell.Text = string.Format(cell.Text, "<br />"); } }限制是控件必须命名为"gv1" , 不过这对我现在的情况来说不是个限制, 我本来就每个页面都起一样的名字, 缺点是每次回发都执行一次, 效率不好.期待更好的解决方案... <asp:BoundField DataField="xh" HeaderText="序<br/>号" HtmlEncode="false"/>我这个实现了 需要把HtmlEncode属性设置为false,<br/>就不会在后台解析,然后在客户端展现换行的效果 <asp:BoundField DataField="xh" HeaderText="序<br/>号" HtmlEncode="false"/>这个换行行之间的间隔好大啊,有点难看,不知道有没有好看点的方法呢? wcf web.config 报错问题 想问下关于xml数据的使用问题 关于站内搜索的问题,请教 #######高手帮帮忙啊########### 讨论:(UBB代码支持)是什么技术?一般用在什么地方?是为了解决什么样的问题? 每次往服务器更新dll,网站打不开,求高手解决 有没有什么好一点的方法,在程序改动不大的前题下,把这些关键字过滤了! 还是一个asp.net 作论坛的问题 asp.net突然不能用了!现实链接localhost------ 关于天网防火墙设置的问题~~~~~~~ 高分求助,用字典来过滤留言板的关键词 在网页上如何实现rmvb文件的连续播放
老大, 这是不可能的... 我只是举这么例子, 大多数情况下, 不可能调到自己希望的宽度, 因为列宽取决于数据宽.
回三楼:
<asp:BoundField HeaderText="一二三四五" HeaderStyle-Width="100px" DataField="test" ItemStyle-Wrap="false" />
回四楼:
如果你的数据只有一个数字, 而表头长达十个字, 而且这样的列有四五列, 你觉得换行难看, 还是不换行难看?
<asp:BoundField HeaderText="一二<br/>三四五"/>
你用的是BoundField 吗? TemplateField 可以, 但是BoundField 我这边不行啊, 或者你把整个测试项目的文件发给我, [email protected] 谢谢.
<asp:GridView ID="gridList" runat="server">
<Columns>
<asp:BoundField HeaderText="a<br/>b" />
</Columns>
</asp:GridView>如果你的不可以,那么你也可以这样:private void gridList_RowDataBound(object sender, System.Web.UI.WebControls.GridViewRowEventArgs e)
{
if(e.Row.RowType==DataControlRowType.Header)
{
e.Row.Cells[0].Text = "a<br/>b";
}
}
在RowDataBound 事件中我无论如何也不可能接受... 没效率可言了
gridview 定义的地方的代码我当然也是知道怎么写的, 我现在怀疑你的环境配置可能和我的不一样, 导致不一样的结果, 例如web.config 或是其它的因素影响, 所以我想让你把整个项目发给我看一下. 另外, 我是用vs2008, 如果你用的是vs2005, 可能跟.net framework 的版本也有关系. 所以..还是麻烦你发一下吧, 谢谢.
private void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
ArrayList al = new ArrayList();
al.Add("a");
al.Add("a");
al.Add("a");
al.Add("a");
s.DataSource = al;
s.DataBind(); foreach (TableCell o in s.HeaderRow.Cells)
{
o.Text = string.Format(o.Text, "<br/>");
}
}
}
</script>
.....
<asp:GridView ID="s" runat="server">
<Columns>
<asp:BoundField HeaderText="a{0}b" />
</Columns>
</asp:GridView>
.....
十分感谢!
但是这个方法也让人很难满意, 首先, 即使只在page_load 里面做一次, 就很烦, 因为每个页面都需要把这几句拷过去, 感觉很累赘, 更何况, 一个页面不止需要做一次, 只要重新绑定数据, 就需要再做一遍, 只为实现这么点小功能. -_-##
public class myGridView : GridView
.....所有都不变, 只把HeaderRow 格式化一下,即可.
我再等等吧, 实在没有别的办法的话就结贴了.
<controls>
<add .... />
<controls>
</pages>所有页面均可调用.
虽然编译通过, 可惜不会执行gv1_DataBound, 有没有办法让母版页函数处理内容页的控件的事件?
protected void Page_Load(object sender, EventArgs e)
{
var gv1 = ContentPlaceHolder1.FindControl("gv1") as System.Web.UI.WebControls.GridView;
if (gv1 == null)
return; gv1.DataBound += new EventHandler(gv1_DataBound); } void gv1_DataBound(object sender, EventArgs e)
{
var gv1=sender as GridView;
foreach (TableCell cell in gv1.HeaderRow.Cells)
{
cell.Text = string.Format(cell.Text, "<br />");
}
}
{
var gv1 = ContentPlaceHolder1.FindControl("gv1") as System.Web.UI.WebControls.GridView;
if (gv1 == null)
return; foreach (TableCell cell in gv1.HeaderRow.Cells)
{
cell.Text = string.Format(cell.Text, "<br />");
}
}
限制是控件必须命名为"gv1" , 不过这对我现在的情况来说不是个限制, 我本来就每个页面都起一样的名字,
缺点是每次回发都执行一次, 效率不好.
期待更好的解决方案...
我这个实现了
这个换行行之间的间隔好大啊,有点难看,不知道有没有好看点的方法呢?