none
关于Gridview绑定数据时如何更具值修改style RRS feed

  • 问题

  • 我需要在数据绑定时根据数据库读出来的值修改style.display = 'none'或'block'。应该是使用gridview的GridView1_RowDataBound事件还是GridView1_DataBounding?事件处理怎么写呢?
    比如有两个层
    <div id="div1" style="display:block"></div>
    <div id="div2" style="display:none"></div>
    如果读出来的数据是“yes” 就修改div1.style.display = 'none';div2.style.display='block';

    郭鹏
    2009年2月17日 13:46

答案

  • 无论几个div就是很简单的,下面是一个完整的例子。可以直接拷贝运行。知道了原理,可以以不变应万变。

    <%@ Page Language="C#" %> 
     
    <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("学生班级", typeof(System.String)));  
        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 = 0; i < 8; i++)  
        {  
          System.Random rd = new System.Random(Environment.TickCount * i); ;  
          dr = dt.NewRow();  
          dr[0] = "班级" + i.ToString();  
          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 = this.CreateDataSourceByXianhuiMeng();  
        GridView1.DataBind();  
     
      }  
     
      protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)  
      {  
        if (e.Row.RowType == DataControlRowType.DataRow)  
        {  
          HtmlGenericControl div1 = (HtmlGenericControl)e.Row.FindControl("div1");  
          HtmlGenericControl div2 = (HtmlGenericControl)e.Row.FindControl("div2");  
          //根据计算机程序判断是否显示  
          System.Data.DataRowView dv = (System.Data.DataRowView)e.Row.DataItem;  
          if (Convert.ToDecimal(dv["计算机"]) < 60)  
          {  
            div1.Style["display"] = "none";  
          }  
          else  
          {  
            div2.Style["display"] = "none";  
          }  
        }  
      }  
    </script> 
     
    <html xmlns="http://www.w3.org/1999/xhtml">  
    <head id="Head1" runat="server">  
      <title></title>  
    </head> 
    <body> 
      <form id="form1" runat="server">  
      <asp:GridView ID="GridView1" runat="server" OnRowDataBound="GridView1_RowDataBound">  
        <Columns> 
          <asp:TemplateField> 
            <ItemTemplate> 
              <div id="div1" runat="server" style="background: #0099FF"><%#Eval("学生班级")%></div>  
              <div id="div2" runat="server" style="background: #ee0000"><%#Eval("语文")%></div>  
            </ItemTemplate> 
          </asp:TemplateField> 
        </Columns> 
      </asp:GridView> 
      </form> 
    </body> 
    </html> 
     

    孟宪会
    • 已标记为答案 Hugo12345 2009年2月19日 17:03
    2009年2月18日 15:56
    版主

全部回复

  •  gridview的GridView1_RowDataBound  比较适合取得行的详细数据
    不过这个事件一般是用来处理内部元素的 style的  因为一般会出现多行 所以会运行多次 不太适合绑定外部style
    梁赫群是榜样 赵正平是偶像 恩?还有个人么?
    2009年2月17日 15:25
  • gridview有N行,你要根据哪行来进行判断?
    如果每行的状态都是相同的,也是可以的,可以在GridView1_RowDataBound里判断。在cs里设置一个全局的变量(public的成员),在GridView1_RowDataBound里根据你的条件赋值为none还是block,然后再

    <div id="div1" style="display:<%=var1%>"></div>
    <div id="div2" style="display:<%=var2%>"></div>

    即可。
    如果div设置为服务器端的HTML控件,则可以在cs直接进行设置

    <div id="div1" runat=server></div>

    div1.Attributes.Add("style","display:none");


    做这样的功能,你需要比较了解gridview的运行机制和HTML的相关知识
    孟宪会
    2009年2月18日 1:10
    版主
  • 数据有N行,每一行的值可能不一样。也就是说每一行都有
    <div id="div1"></div><div id="div2"></div>
     我需要根据每一行自己的值(从数据库读出)来修改自己这一行的div的display属性;
    郭鹏
    2009年2月18日 5:34
  •  这个问题怎么解决啊?
    郭鹏
    2009年2月18日 14:25
  • 无论几个div就是很简单的,下面是一个完整的例子。可以直接拷贝运行。知道了原理,可以以不变应万变。

    <%@ Page Language="C#" %> 
     
    <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("学生班级", typeof(System.String)));  
        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 = 0; i < 8; i++)  
        {  
          System.Random rd = new System.Random(Environment.TickCount * i); ;  
          dr = dt.NewRow();  
          dr[0] = "班级" + i.ToString();  
          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 = this.CreateDataSourceByXianhuiMeng();  
        GridView1.DataBind();  
     
      }  
     
      protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)  
      {  
        if (e.Row.RowType == DataControlRowType.DataRow)  
        {  
          HtmlGenericControl div1 = (HtmlGenericControl)e.Row.FindControl("div1");  
          HtmlGenericControl div2 = (HtmlGenericControl)e.Row.FindControl("div2");  
          //根据计算机程序判断是否显示  
          System.Data.DataRowView dv = (System.Data.DataRowView)e.Row.DataItem;  
          if (Convert.ToDecimal(dv["计算机"]) < 60)  
          {  
            div1.Style["display"] = "none";  
          }  
          else  
          {  
            div2.Style["display"] = "none";  
          }  
        }  
      }  
    </script> 
     
    <html xmlns="http://www.w3.org/1999/xhtml">  
    <head id="Head1" runat="server">  
      <title></title>  
    </head> 
    <body> 
      <form id="form1" runat="server">  
      <asp:GridView ID="GridView1" runat="server" OnRowDataBound="GridView1_RowDataBound">  
        <Columns> 
          <asp:TemplateField> 
            <ItemTemplate> 
              <div id="div1" runat="server" style="background: #0099FF"><%#Eval("学生班级")%></div>  
              <div id="div2" runat="server" style="background: #ee0000"><%#Eval("语文")%></div>  
            </ItemTemplate> 
          </asp:TemplateField> 
        </Columns> 
      </asp:GridView> 
      </form> 
    </body> 
    </html> 
     

    孟宪会
    • 已标记为答案 Hugo12345 2009年2月19日 17:03
    2009年2月18日 15:56
    版主