在学asp.net技术内幕这本书,有个例子中的一条语句不是很明白,请大家帮忙看看.代码:
<%@ Page Language="VB" Debug="true" %>
<%@ Import Namespace="System.Data.SqlClient" %><Script Runat="Server">Sub Page_Load
  If Not IsPostBack Then
    Dim conNorthwind As SqlConnection
    Dim cmdSelect As SqlCommand
    Dim dtrCategories As SqlDataReader    conNorthwind = New SqlConnection( "Server=localhost;UID=sa;PWD=;Database=Northwind" )
    cmdSelect = New SqlCommand( "Select CategoryName From Categories", conNorthwind )
    conNorthwind.Open()
    dtrCategories = cmdSelect.ExecuteReader()    rptCategories.DataSource = dtrCategories
    rptCategories.DataBind()    dtrCategories.Close()
    conNorthwind.Close()
  End If
End SubSub Button_Click( s As Object, e As RepeaterCommandEventArgs )
  Dim lbtnSelected As LinkButton  lbtnSelected = e.Item.Controls( 1 )
  lblCategory.Text = "You selected " & lbtnSelected.Text
End Sub</Script><html>
<head><title>LinkButtonList.aspx</title></head>
<body>
<form Runat="Server"><asp:Repeater
  ID="rptCategories"
  OnItemCommand="Button_Click"
  Runat="Server"><ItemTemplate>
  <li>
  <asp:LinkButton
   Text='<%# Container.DataItem( "CategoryName" ) %>'
   Runat="Server" />
</ItemTemplate></asp:Repeater><p>
<asp:Label
  ID="lblCategory"
  Runat="Server" /></form>
</body>
</html>
========================其中的  lbtnSelected = e.Item.Controls( 1 )  ,为什么要用 1 呢?请大家帮忙解释一下,谢谢.

解决方案 »

  1.   

    because "<li>" LiterlaControl, is the first control? but I think the implementation is bad, <ItemTemplate>
      <li>
      <asp:LinkButton id="lbCat"
       Text='<%# Container.DataItem( "CategoryName" ) %>'
       Runat="Server" />
    </ItemTemplate>
    lbtnSelected = DirectCast(e.Item.FindControl("lbCat"), LinkButton)is probably better
      

  2.   

    我觉得也不可能把<li>当成一个item啊。..
    不过如果这样没错的话.那看来是把button当成第二个item了。
      

  3.   

    按楼上的说法,saucer(思归) 大哥也不确定<li>为一个控件,现在我把<li>这行给删除了,可程序还是一样正常运行呀?这又怎么解释呢?大家帮帮忙呀.谢谢.
      

  4.   

    我在原代码又加上个linkbutton,程序也一样正常,大家帮忙看看:
    <%@ Page Language="VB" Debug="true" %>
    <%@ Import Namespace="System.Data.SqlClient" %><Script Runat="Server">Sub Page_Load
      If Not IsPostBack Then
        Dim conNorthwind As SqlConnection
        Dim cmdSelect As SqlCommand
        Dim dtrCategories As SqlDataReader    conNorthwind = New SqlConnection( "Server=nh;UID=sa;PWD=;Database=Northwind" )
        cmdSelect = New SqlCommand( "Select * From Categories", conNorthwind )
        conNorthwind.Open()
        dtrCategories = cmdSelect.ExecuteReader()    rptCategories.DataSource = dtrCategories
        rptCategories.DataBind()    dtrCategories.Close()
        conNorthwind.Close()
      End If
    End SubSub Button_Click( s As Object, e As RepeaterCommandEventArgs )
        Dim lbtnSelected As LinkButton
        lbtnSelected = e.Item.Controls(1)
        lblCategory.Text = "You selected " & lbtnSelected.Text    Dim lbtnSelected2 As LinkButton
        lbtnSelected2 = e.Item.Controls(3)
        lblCategory2.Text = "You selected " & lbtnSelected2.Text
    End Sub</Script><html>
    <head><title>LinkButtonList.aspx</title></head>
    <body>
    <form Runat="Server"><asp:Repeater
      ID="rptCategories"
      OnItemCommand="Button_Click"
      Runat="Server">
    <ItemTemplate>  <asp:LinkButton
       Text='<%# Container.DataItem( "CategoryName" ) %>'
       Runat="Server" />   <asp:LinkButton
       Text='<%# Container.DataItem( "Categoryid" ) %>'
       Runat="Server" />
    </ItemTemplate>
    </asp:Repeater>
    <p>
    <asp:Label
      ID="lblCategory"
      Runat="Server" />
    <BR>
    <asp:Label
      ID="lblCategory2"
      Runat="Server" />
    </form>
    </body>
    </html>
      

  5.   

    你前面有个空格,试一下<ItemTemplate><asp:LinkButton
       Text='<%# Container.DataItem( "CategoryName" ) %>'
       Runat="Server" />或者看一下Sub Button_Click( s As Object, e As RepeaterCommandEventArgs )
       for each c as Control in e.Item.Controls
           Page.Response.Write(c.GetType().Name & "<BR>")
       next
    End Sub
      

  6.   

    谢谢saucer(思归) .
    程序就是把<li>,空行,空格等当成一个LiterlaControl.