前天遇到了一个问题如下在后台vb.net代码中的page_onload事件里面 得到了一个Integer类型的变量
可能值范围是 1-5我想在前台页面 根据这个变量的值 来将一个 比如说 lable, 循环显示这个变量值的次数后来自己琢磨了一下 用以下的方法解决了
1.后台定义一个global的变量  Public star As Integer = 0
2.然后再定义一个针对该变量值 所执行操作的方法
    Function printStar() '我这个方法是打星星用的        
       If star = 0 Then
            Response.Write("No Ranking Record")
        Else
            Dim i As Integer
            For i = 0 To star - 1
                Response.Write("<IMG src='img/ic_star.gif' height=15 width=15>")
            Next
        End If
    End Function3.最后前台显示处对该方法进行调用
...<td> <%printStar()%>  </td>...---------------------------------------------------------------------------------------今天又遇到了类似的问题 所不同的是:前台不是说某一处需要输出,而是在一个datalist里面的循环里面,根据记录集的每一条记录中的一个字段中的值(该值为Integer) 进行输出。
大致代码如下:
<asp:datalist id="dlProduct2" runat="server">
<ItemTemplate>
'每一条记录都在一个table里面
<table border="0" cellspacing="0" cellpadding="0" align="center">
<tr>
  <td>
    '比如这一行是需要绑定到datatable里的 ProductTitle 字段
    <asp:Label id="Label2" runat="server" ForeColor="Black" Font-Bold="True">
      产品名:<%#DataBinder.Eval(Container.DataItem,"ProductTitle")%>
    </asp:Label>
  </td>
</tr><tr>
  <td>
'问题就出在这一行,在这里我需要根据字段Rank的值(可能值为1--5) 动态将一个image打印
'如果我的代码这么写:<%printStar(DataBinder.Eval(Container.DataItem,"Rank"))%> 
'则编译不通过 说是Container没有声明'如果我这么写:<%#printStar(DataBinder.Eval(Container.DataItem,"Rank"))%>
'星星确实是打了 而且都正确 问题是 所有的星星 都被输出到了页面的最上方!
'请问有解决方法么???
  </td>
</tr></table></ItemTemplate>
</asp:datalist>PS:改动后的printStar方法如下:
    Function printStar(ByVal star As Integer) 
        Dim i As Integer
            For i = 0 To star - 1                
                Response.Write("<IMG src='img/ic_star.gif' height=15 width=15>")
            Next
        End If
    End Function

解决方案 »

  1.   

    考虑使用一个嵌套的repeater<asp:repeater id="rp" runat="server"  datasource='<%# new String(CInt(DataBinder.Eval(Container.DataItem,"Rank")))-1){} %>'>
    <ItemTemplate>
    <IMG src='img/ic_star.gif' height=15 width=15>
    </ItemTemplate>
    </asp:repeater>
      

  2.   

    Response.Write 打破了ASP.NET的封装,它的输出是在页面的最前面,你坚持你的做法,printStar应该返回一个字符串
      

  3.   

    其实我也是这么想的 在该位置放置一个repeater
    但是不会设置repeater的datasource我刚才试了下 你的方法error如下:
    c:\inetpub\wwwroot\EMOBILE\Default.aspx(183) : error BC30311: Value of type 'Integer' cannot be converted to '1-dimensional array of Char'.            dataBindingExpressionBuilderTarget.DataSource = CType( new String(CInt(DataBinder.Eval(Container.DataItem,"Rank")))-1){} ,Object)
                                                                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~               
    c:\inetpub\wwwroot\EMOBILE\Default.aspx(183) : error BC30944: Syntax error in cast operator; two arguments separated by comma are required.            dataBindingExpressionBuilderTarget.DataSource = CType( new String(CInt(DataBinder.Eval(Container.DataItem,"Rank")))-1){} ,Object)
      

  4.   

    另外还有个不解之处  就是
    repeater的datasource不是应该指向一个数据集么?
    它里面的ItemTemplate会被循环 该数据集中rows的次数而你上面指向的
    <%# new String(CInt(DataBinder.Eval(Container.DataItem,"Rank")))-1){} %>是想要让他指向一个String 数组么?
      

  5.   

    '1-dimensional array of Char'???
    DataBinder.Eval(Container.DataItem,"Rank")是你的值,转换成数字CInt(DataBinder.Eval(Container.DataItem,"Rank"))再生成一个空的数组,起数据源作用(说白了,就是一个循环).DataSource = new integer(CInt(DataBinder.Eval(Container.DataItem,"Rank"))-1){}
      

  6.   

    对,datasource可以是IEnumerable ,集合,数组,我这个方法也许不是很经济,但应该是最比较简洁的,因为这样就把所以HTML都放在ASPX文件里了
      

  7.   

    学到了东西如果是这样 就可以了 
    datasource='<%# new String(  CType(   DataBinder.Eval(Container.DataItem,"Rank"),Integer  )  -1){} %>'
      

  8.   

    原来一直搞java的东东  比较熟悉jsp
    对于vb语言 还是不熟悉  数组这是第一次用。汗!不过还是很谢谢你的!!!!!!!!!!!!!
      

  9.   

    还有个问题 就是 我怎么样修改在csdn的 注册资料 以及 看我还有多少分???
    找了半天 没看到在哪里?
      

  10.   

    WebForm 中xxx.DataSource只能接受一维数组