none
gridview设定表头排序后修改A标签内容 RRS feed

  • 问题

  • 设定gridview表头排序后,源表头的内容变成了
    <a href="javascript:__doPostBack('GridView1','Sort$code')">code</a>
    结果原来在后台
    cell.text拿不出内容了, 有没有办法在后台把这整段<A>标签拿出来然后改了它?
    我需要在它外面多包一层div。
    2009年11月23日 3:47

答案

  • <%@ Page Language="C#" EnableEventValidation="false" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <script runat="server">
        System.Data.DataView CreateDataSourceByXianhuiMeng()
        {
            System.Data.DataTable dt = new System.Data.DataTable();
            System.Data.DataRow dr;
            dt.Columns.Add(new System.Data.DataColumn("id", typeof(System.Int32)));
            dt.Columns.Add(new System.Data.DataColumn("学生姓名", typeof(System.String)));
            dt.Columns.Add(new System.Data.DataColumn("语文", typeof(System.Decimal)));
            dt.Columns.Add(new System.Data.DataColumn("数学", typeof(System.Decimal)));
            dt.Columns.Add(new System.Data.DataColumn("英语", typeof(System.Decimal)));
            dt.Columns.Add(new System.Data.DataColumn("计算机", typeof(System.Decimal)));
    
            for (int i = 1; i < 6; i++)
            {
                System.Random rd = new System.Random(Environment.TickCount * i); ;
                dr = dt.NewRow();
                dr[0] = i;
                dr[1] = "孟子E章-" + i.ToString();
                dr[2] = System.Math.Round(rd.NextDouble() * 100, 2);
                dr[3] = System.Math.Round(rd.NextDouble() * 100, 2);
                dr[4] = System.Math.Round(rd.NextDouble() * 100, 2);
                dr[5] = System.Math.Round(rd.NextDouble() * 100, 2);
                dt.Rows.Add(dr);
            }
            System.Data.DataView dv = new System.Data.DataView(dt);
            return dv;
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            GridView1.DataSource = CreateDataSourceByXianhuiMeng();
            GridView1.DataBind();
    
            for (int i = 0; i < GridView1.HeaderRow.Cells.Count; i++)
            {
                System.Text.StringBuilder sb = new System.Text.StringBuilder();
                System.IO.StringWriter sw = new System.IO.StringWriter(sb);
                HtmlTextWriter htw = new HtmlTextWriter(sw);
                LinkButton l = GridView1.HeaderRow.Cells[i].Controls[0] as LinkButton;
                l.RenderControl(htw);
                Response.Write("<li>" + Server.HtmlEncode(sb.ToString()));
            }
        }
    
        public override void VerifyRenderingInServerForm(Control control)
        {
        }
    
        protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
        {
    
        }
    </script>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <asp:GridView ID="GridView1" runat="server" ShowHeader="true" AutoGenerateColumns="true"
            AllowSorting="true" OnSorting="GridView1_Sorting">
        </asp:GridView>
        </form>
    </body>
    </html>
    

    【孟子E章】
    • 已标记为答案 scate233 2009年11月24日 8:49
    2009年11月24日 3:01
    版主
  • 忘记了gridview怎么写了
    目前想到重新写字段可以达到
         public class bound :System.Web.UI.WebControls.BoundField
        {
           public override void InitializeCell(DataControlFieldCell cell, DataControlCellType cellType, DataControlRowState rowState, int rowIndex)
            {
                if (this.ShowHeader && this.SortExpression.Length > 0 && cellType == DataControlCellType.Header)
                {
                    base.InitializeCell(cell, cellType, rowState, rowIndex);
                    if (cell.HasControls())
                    {
                        LinkButton link = cell.Controls[0] as LinkButton;
                        System.Web.UI.WebControls.Panel divs = new Panel();
                        divs.Controls.Add(link);
                        cell.Controls.Add(divs);
                    }
                }
                else
                    base.InitializeCell(cell, cellType, rowState, rowIndex);
            }

        }       

    • 已标记为答案 scate233 2009年11月24日 8:48
    2009年11月24日 8:08

全部回复

  • 你这不是文本 用text取不到
    只能用服务端 id .FindControl方法
    2009年11月23日 7:31
  • 麻烦请举例下怎么拿那段出来改,假设那个表头字段我已经设定并知道 Control 为 Cell1

    2009年11月23日 7:41
  • (Headerxxx. FindControl("LinkButton1") as LinkButton).Text
    【孟子E章】
    2009年11月23日 8:00
    版主
  •    foreach (GridViewRow r in GridView1.Rows)
                {
                    if (r.RowType == DataControlRowType.Header)
                    {  
                     r.cells[0] . FindControl("LinkButton1") as LinkButton).Text

    2009年11月23日 8:08
  • 出了未引用到实例错误

    if (HeaderRow != null)
    {
           foreach (TableCell cell in HeaderRow.Cells)
          {
                string str = cell.Text;

               string tmp =  (cell.FindControl("LinkButton1")  as LinkButton).Text;     //这里该怎么写??                              
          }
     }
    2009年11月23日 9:02
  • 你这是扩展gridview控件的 那控件还没绑定的  所以出错

    2009年11月23日 9:22
  • <%@ Page Language="C#" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <script runat="server">
        System.Data.DataView CreateDataSourceByXianhuiMeng()
        {
            System.Data.DataTable dt = new System.Data.DataTable();
            System.Data.DataRow dr;
            dt.Columns.Add(new System.Data.DataColumn("id", typeof(System.Int32)));
            dt.Columns.Add(new System.Data.DataColumn("学生姓名", typeof(System.String)));
            dt.Columns.Add(new System.Data.DataColumn("语文", typeof(System.Decimal)));
            dt.Columns.Add(new System.Data.DataColumn("数学", typeof(System.Decimal)));
            dt.Columns.Add(new System.Data.DataColumn("英语", typeof(System.Decimal)));
            dt.Columns.Add(new System.Data.DataColumn("计算机", typeof(System.Decimal)));
    
            for (int i = 1; i < 6; i++)
            {
                System.Random rd = new System.Random(Environment.TickCount * i); ;
                dr = dt.NewRow();
                dr[0] = i;
                dr[1] = "孟子E章-" + i.ToString();
                dr[2] = System.Math.Round(rd.NextDouble() * 100, 2);
                dr[3] = System.Math.Round(rd.NextDouble() * 100, 2);
                dr[4] = System.Math.Round(rd.NextDouble() * 100, 2);
                dr[5] = System.Math.Round(rd.NextDouble() * 100, 2);
                dt.Rows.Add(dr);
            }
            System.Data.DataView dv = new System.Data.DataView(dt);
            return dv;
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            GridView1.DataSource = CreateDataSourceByXianhuiMeng();
            GridView1.DataBind();
        }
        protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
        {
            Response.Write((((sender as GridView).HeaderRow.Controls[5] as DataControlFieldHeaderCell).Controls[0] as LinkButton).Text);
        }
    </script>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <asp:GridView ID="GridView1" runat="server" ShowHeader="true" AutoGenerateColumns="true"
            AllowSorting="true" OnSorting="GridView1_Sorting">
        </asp:GridView>
        </form>
    </body>
    </html>
    

    【孟子E章】
    2009年11月23日 9:27
    版主
  • 也可以 

    protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
    {
        Response.Write(((sender as GridView).HeaderRow.Cells[5].Controls[0] as LinkButton).Text);
    }

    【孟子E章】
    2009年11月23日 9:28
    版主
  •  protected override void OnSorted(EventArgs e)
      {
      
       
       foreach (DataControlField f in this.Columns)
       {

              f.HeaderText
    2009年11月23日 9:46
  • 我曾经试着写

    if (HeaderRow != null)
    {
           foreach (TableCell cell in HeaderRow.Cells)
          {
               
              Cell.Text = "1";                              
          }
     }

    结果表头没了,在察看源码对比后,发现 <a href="javascript:__doPostBack('GridView1','Sort$code')">code</a> 这句没了,全部变成1,应该是在赋值的时候抹掉了些什么东西
    2009年11月23日 9:47
  • 再次测试,在Render的
    if (HeaderRow != null)
    {
           foreach (TableCell cell in HeaderRow.Cells)
          {
               
             string str =  Cell.Text ;                              
          }
     }

    这里 Cell.Text 已经有内容了,就是绑定的字段名

    2009年11月23日 10:22
  • 赋值方法

    (GridView1.HeaderRow.Cells[5].Controls[0] as LinkButton).Text = "xxxx";
    【孟子E章】
    2009年11月23日 12:48
    版主
  • 差不多重写个字段
      public class bound :System.Web.UI.WebControls.BoundField
        {
           public override void InitializeCell(DataControlFieldCell cell, DataControlCellType cellType, DataControlRowState rowState, int rowIndex)
            {
                if (this.ShowHeader && this.SortExpression.Length > 0 && cellType == DataControlCellType.Header)
                {
                    base.InitializeCell(cell, cellType, rowState, rowIndex);
                    if (cell.HasControls())
                    {
                        LinkButton link = cell.Controls[0] as LinkButton;
                        link.Text = "321";
                    }
                }
                else
                    base.InitializeCell(cell, cellType, rowState, rowIndex);
            }

        }

    2009年11月23日 14:18
  • 两位理解错我的意思了,我希望的是拿出<A>标签的内容,并修改它,Countrols拿出来的只有表头text,如开始所说的,我想在Render时取出A标签,并在它外部多套一层div

    2009年11月24日 1:24
  • GridView1.HeaderRow.Cells[5].Controls[0] as LinkButton

    Countrols拿出来的只有表头text??
    拿出来的不就是控件啊。
    (GridView1.HeaderRow.Cells[5].Controls[0] as LinkButton).Text = "xxxx";不就是改变文字了吗?

    完整的例子
    <%@ Page Language="C#" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <script runat="server">
        System.Data.DataView CreateDataSourceByXianhuiMeng()
        {
            System.Data.DataTable dt = new System.Data.DataTable();
            System.Data.DataRow dr;
            dt.Columns.Add(new System.Data.DataColumn("id", typeof(System.Int32)));
            dt.Columns.Add(new System.Data.DataColumn("学生姓名", typeof(System.String)));
            dt.Columns.Add(new System.Data.DataColumn("语文", typeof(System.Decimal)));
            dt.Columns.Add(new System.Data.DataColumn("数学", typeof(System.Decimal)));
            dt.Columns.Add(new System.Data.DataColumn("英语", typeof(System.Decimal)));
            dt.Columns.Add(new System.Data.DataColumn("计算机", typeof(System.Decimal)));
    
            for (int i = 1; i < 6; i++)
            {
                System.Random rd = new System.Random(Environment.TickCount * i); ;
                dr = dt.NewRow();
                dr[0] = i;
                dr[1] = "孟子E章-" + i.ToString();
                dr[2] = System.Math.Round(rd.NextDouble() * 100, 2);
                dr[3] = System.Math.Round(rd.NextDouble() * 100, 2);
                dr[4] = System.Math.Round(rd.NextDouble() * 100, 2);
                dr[5] = System.Math.Round(rd.NextDouble() * 100, 2);
                dt.Rows.Add(dr);
            }
            System.Data.DataView dv = new System.Data.DataView(dt);
            return dv;
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            GridView1.DataSource = CreateDataSourceByXianhuiMeng();
            GridView1.DataBind();
        }
    
    
        protected void GridView1_PreRender(object sender, EventArgs e)
        {
            for (int i = 0; i < GridView1.HeaderRow.Cells.Count; i++)
            {
                (GridView1.HeaderRow.Cells[i].Controls[0] as LinkButton).Text = "新的名字" + i.ToString();
            }
        }
    </script>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <asp:GridView ID="GridView1" runat="server" ShowHeader="true" AutoGenerateColumns="true"
            AllowSorting="true" OnPreRender="GridView1_PreRender">
        </asp:GridView>
        </form>
    </body>
    </html>
    


    【孟子E章】
    2009年11月24日 1:57
    版主
  • 孟老师,我要的是那出这整段文字
    <a href="javascript:__doPostBack('GridView1','Sort$code')">code</a>

    不只是名字

    2009年11月24日 2:06
  • <%@ Page Language="C#" EnableEventValidation="false" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <script runat="server">
        System.Data.DataView CreateDataSourceByXianhuiMeng()
        {
            System.Data.DataTable dt = new System.Data.DataTable();
            System.Data.DataRow dr;
            dt.Columns.Add(new System.Data.DataColumn("id", typeof(System.Int32)));
            dt.Columns.Add(new System.Data.DataColumn("学生姓名", typeof(System.String)));
            dt.Columns.Add(new System.Data.DataColumn("语文", typeof(System.Decimal)));
            dt.Columns.Add(new System.Data.DataColumn("数学", typeof(System.Decimal)));
            dt.Columns.Add(new System.Data.DataColumn("英语", typeof(System.Decimal)));
            dt.Columns.Add(new System.Data.DataColumn("计算机", typeof(System.Decimal)));
    
            for (int i = 1; i < 6; i++)
            {
                System.Random rd = new System.Random(Environment.TickCount * i); ;
                dr = dt.NewRow();
                dr[0] = i;
                dr[1] = "孟子E章-" + i.ToString();
                dr[2] = System.Math.Round(rd.NextDouble() * 100, 2);
                dr[3] = System.Math.Round(rd.NextDouble() * 100, 2);
                dr[4] = System.Math.Round(rd.NextDouble() * 100, 2);
                dr[5] = System.Math.Round(rd.NextDouble() * 100, 2);
                dt.Rows.Add(dr);
            }
            System.Data.DataView dv = new System.Data.DataView(dt);
            return dv;
        }
        protected void Page_Load(object sender, EventArgs e)
        {
            GridView1.DataSource = CreateDataSourceByXianhuiMeng();
            GridView1.DataBind();
    
            for (int i = 0; i < GridView1.HeaderRow.Cells.Count; i++)
            {
                System.Text.StringBuilder sb = new System.Text.StringBuilder();
                System.IO.StringWriter sw = new System.IO.StringWriter(sb);
                HtmlTextWriter htw = new HtmlTextWriter(sw);
                LinkButton l = GridView1.HeaderRow.Cells[i].Controls[0] as LinkButton;
                l.RenderControl(htw);
                Response.Write("<li>" + Server.HtmlEncode(sb.ToString()));
            }
        }
    
        public override void VerifyRenderingInServerForm(Control control)
        {
        }
    
        protected void GridView1_Sorting(object sender, GridViewSortEventArgs e)
        {
    
        }
    </script>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <asp:GridView ID="GridView1" runat="server" ShowHeader="true" AutoGenerateColumns="true"
            AllowSorting="true" OnSorting="GridView1_Sorting">
        </asp:GridView>
        </form>
    </body>
    </html>
    

    【孟子E章】
    • 已标记为答案 scate233 2009年11月24日 8:49
    2009年11月24日 3:01
    版主
  • 那句话拿到了,在扩展控件里搬到override void Render(HtmlTextWriter writer)报索引超范围,应该是拿的时候还没有建立表头的Control,是不是要放在别的地方?

    2009年11月24日 3:59
  • 忘记了gridview怎么写了
    目前想到重新写字段可以达到
         public class bound :System.Web.UI.WebControls.BoundField
        {
           public override void InitializeCell(DataControlFieldCell cell, DataControlCellType cellType, DataControlRowState rowState, int rowIndex)
            {
                if (this.ShowHeader && this.SortExpression.Length > 0 && cellType == DataControlCellType.Header)
                {
                    base.InitializeCell(cell, cellType, rowState, rowIndex);
                    if (cell.HasControls())
                    {
                        LinkButton link = cell.Controls[0] as LinkButton;
                        System.Web.UI.WebControls.Panel divs = new Panel();
                        divs.Controls.Add(link);
                        cell.Controls.Add(divs);
                    }
                }
                else
                    base.InitializeCell(cell, cellType, rowState, rowIndex);
            }

        }       

    • 已标记为答案 scate233 2009年11月24日 8:48
    2009年11月24日 8:08
  • 我愿意也是修改那段,把
    <a href="javascript:__doPostBack('GridView1','Sort$code')">code</a>

    在render时拿出来,然后外面套一个div再塞回去,用于贴图什么的,再试试看,实在不行就算了

    2009年11月24日 8:47
  •     public class grids:GridView
        {
            protected override void Render(System.Web.UI.HtmlTextWriter writer)
            {
               
                if (this.ChildControlsCreated)
                {
                    if (this.HeaderRow != null && this.AllowSorting)
                        for (int i = 0; i < this.HeaderRow.Cells.Count; i++)
                        {
                            if (this.HeaderRow.Cells[i].HasControls())
                            {

                                LinkButton link = this.HeaderRow.Cells[i].Controls[0] as LinkButton;
                                System.Web.UI.WebControls.Panel divs = new Panel();
                                divs.Controls.Add(link);
                                this.HeaderRow.Cells[i].Controls.Add(divs);

                               
                            }
                        }
                   
                }base.Render(writer);
            }
        }
    }

    • 已建议为答案 mldark 2009年11月24日 10:03
    2009年11月24日 9:17
  • columnIndex  这东西对应的div参数是什么?直接打点没有这个,加了 divs.CssClass = "RHead"; 还要有个 columnIndex  这参数没找到
    2009年11月24日 9:45
  • columnIndex  这东西对应的div参数是什么?直接打点没有这个,加了 divs.CssClass = "RHead"; 还要有个 columnIndex  这参数没找到

    columnInde?  就是cells素引啊
    不太明白你的意思
    2009年11月24日 9:54
  • 就是说在生成的 html 里是要这样的内容:

    <th id="GridViewPj4_ctl01_0" class="fixRow" scope="col" style="width:100px;"><div id="GridViewPj4_ctl01_1" class="FreeHead" columnIndex ="1" >
          <a href="javascript:__doPostBack('GridViewPj4','Sort$ename')">ename</a>
         </div></th>

    那个1 我有了,columnIndex 怎么在上面那段代码里一并插进去?现在生成的是

    <th id="GridViewPj4_ctl01_0" class="fixRow" scope="col" style="width:100px;"><div id="GridViewPj4_ctl01_1" class="FreeHead"    >
          <a href="javascript:__doPostBack('GridViewPj4','Sort$ename')">ename</a>
         </div></th>

    2009年11月24日 9:58
  •      if (this.HeaderRow.Cells[i].HasControls())
                            {
                                this.HeaderRow.Cells[i].Attributes["columnIndex"] = (i + 1).ToString();
                                LinkButton link = this.HeaderRow.Cells[i].Controls[0] as LinkButton;
                                System.Web.UI.WebControls.Panel divs = new Panel();
                                divs.Controls.Add(link);
                                this.HeaderRow.Cells[i].Controls.Add(divs);

                               
                            }

     

    • 已编辑 mldark 2009年11月24日 10:13 看错了
    2009年11月24日 10:03
  •     if (this.ChildControlsCreated)
                {
                    if (this.HeaderRow != null && this.AllowSorting)
                        for (int i = 0; i < this.HeaderRow.Cells.Count; i++)
                        {
                            if (this.HeaderRow.Cells[i].HasControls())
                            {
                                this.HeaderRow.Cells[i].Attributes["columnIndex"] = (i + 1).ToString();
                                LinkButton link = this.HeaderRow.Cells[i].Controls[0] as LinkButton;
                                System.Web.UI.WebControls.Panel divs = new Panel();
                                divs.Controls.Add(link);
                                this.HeaderRow.Cells[i].Controls.Add(divs);

                               
                            }
                        }
                   
                }base.Render(writer);
            }

    2009年11月24日 10:16
  • 出来了,但是出现在了包含div的th标签里,到div外面去了

    2009年11月25日 1:08
  • 成了!
    那段加多一句
    divs.Attributes["columnIndex"] = i.ToString();

    现在可以在表头贴图拖列宽换样式和排序了
    2009年11月25日 9:14
  • 成了!
    那段加多一句
    divs.Attributes["columnIndex"] = i.ToString();

    现在可以在表头贴图拖列宽换样式和排序了

    晕 你给提示问题代码 我看歪 了  有点眼花 不好意思  还有问题的话 继续跟帖 或者开帖
    2009年11月25日 9:18