代码之家  ›  专栏  ›  技术社区  ›  ShawnMilo

动态网格视图在rowcommand上有0行

  •  1
  • ShawnMilo  · 技术社区  · 15 年前

    我有一个动态创建的网格视图,我使用addhandler命令将一个处理程序附加到它上面。

    问题是,当我试图在该函数中引用sender.rows时,它不会做任何事情,因为它说sender.rows.count=0。

    我已经做了足够多的动态表单创建工作,我确信我正在创建控件,绑定它们,并在页面初始化/加载/加载完成时在适当的点添加处理程序。

    另外,我在另一个非动态窗体上有几乎完全相同的代码,它能够访问行中的值。

    考虑到rowcommand事件正在触发,很明显我正在单击一行。出于某种原因,它不在处理程序事件的范围内。

    有人对如何解决这个问题有什么想法吗?

    背景:我真正想做的是访问数据绑定到行的值。我正在创建一个sqlcommand并将其绑定到动态网格,我更愿意与网格的数据源进行对话,但这似乎不可能。也许我遗漏了一些东西,但目前看来,从网格视图中读取值(我讨厌这样做)是唯一可行的。

    谢谢, 肖恩

    更新(代码):

    创建动态视图(在加载事件时执行)

    sbFormHTML.AppendLine(String.Format("<tr><td colspan=""2""><asp:GridView ID=""{0}"" runat=""server"" DataKeyNames=""primary_key""><Columns>", dataElement.Attributes.GetNamedItem("name").Value))
    
    sbFormHTML.AppendLine("<asp:BoundField DataField=""primary_key"" Visible=""False"" SortExpression=""primary_key"" />")
    sbFormHTML.AppendLine("<asp:CommandField SelectText=""Edit"" ShowSelectButton=""True"" />")
    sbFormHTML.AppendLine("<asp:CommandField ShowDeleteButton=""True"" />")
    
    For Each data_item As XmlNode In dataElement.SelectSingleNode("data_items").ChildNodes
    
        Dim header As String = fnGetAttributeValue(data_item, "label")
        If header = "" Then header = data_item.Attributes.GetNamedItem("dbfield").Value
    
        sbFormHTML.AppendLine(String.Format("<asp:BoundField DataField=""{0}"" HeaderText=""{1}"" SortExpression=""{0}"">", data_item.Attributes.GetNamedItem("dbfield").Value, header))
        sbFormHTML.AppendLine("</asp:BoundField>")
    
    Next
    sbFormHTML.AppendLine("</Columns></asp:GridView>")
    sbFormHTML.AppendLine(String.Format("</td></tr>"))
    

    AddHandler:

    'bind grid RowCommand function to all dynamic grids
    Dim dynamicGrids = findWebControlsRecursive(Page, "^gvDyn")
    For Each dynamicGrid As GridView In dynamicGrids
        AddHandler dynamicGrid.RowCommand, AddressOf subHandleRowCommand
        Response.Write(String.Format("{0} has {1} rows<br/>", dynamicGrid.ID, dynamicGrid.Rows.Count))
    Next
    

    尝试用它做些什么:

    Protected Sub subHandleRowCommand(ByVal sender As GridView, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs)
        'skm
        If e.CommandName = "Select" Then
    
    
            Try
                Response.Write(String.Format("{0} has {1} rows<br/>", sender.ID, sender.Rows.Count))
    
        'Remainder of the code snipped for brevity.
    
    End Sub
    

    数据绑定网格:

    Protected Sub sbLoadGrid(ByVal gridNode As XmlNode)
    
        ' Databind a GridView object to its SQL query
    
        Dim conn As SqlConnection = New SqlConnection('connection string here')
        conn.Open()
        Dim cmd As SqlCommand = New SqlCommand("", conn)
        Dim dbTable As String = gridNode.Attributes.GetNamedItem("dbtable").Value
    
        cmd.CommandText = String.Format("SELECT {0}ID AS primary_key,", dbTable)
        For Each data_item As XmlNode In gridNode.SelectSingleNode("data_items").ChildNodes
            cmd.CommandText &= String.Format(" {0},", data_item.Attributes.GetNamedItem("dbfield").Value)
        Next
    
        cmd.CommandText = Regex.Replace(cmd.CommandText, ",$", String.Format(" FROM {0}", dbTable))
    
        Dim dsGrid As SqlDataReader = cmd.ExecuteReader
    
        Dim tempGrid As GridView = getControlReference(gridNode.Attributes.GetNamedItem("name").Value)
        tempGrid.DataSource = dsGrid
        tempGrid.AutoGenerateColumns = False
    
        tempGrid.DataBind()
    
    
    
    End Sub
    
    2 回复  |  直到 15 年前
        1
  •  1
  •   Ryan Roper    15 年前

    我不知道在哪里可以调用sbloadgrid函数,但我强烈建议您尝试将代码重构为更传统的网格视图创建,设置其属性,如果需要动态的话,可以将其添加到页面上的占位符中。

    对于查询,我建议您在命令文本中使用参数,并将它们添加到SQL命令中。它仍然可以动态地完成,从长远来看,它会使您面对的问题少得多,然后使用正则表达式来构造查询。

    这可能不是你想要的答案,但是除非你有一个非常强大的理由来保持代码的原样,否则我建议你重写它。如果您在查询中得到的列的数量是已知的,那么我甚至建议您在ASP页面中设置它,而不是动态地设置它。

    如果您可以显示两种不同的格式,那么您可以在页面上设置每种格式,并且只进行更改,只更新数据源,并在运行时动态启用其中一种格式,使其在默认情况下处于禁用和隐藏状态。

    所有这些都可能更容易维护。

        2
  •  1
  •   ichiban    15 年前

    由于动态创建了GridView控件,因此视图状态不会持久化,这将解释为什么rows.count在eventHandler中返回为0。