回发时,.NET GridView行为null

时间:2012-09-25 08:35:20

标签: c# .net vb.net gridview viewstate

一旦在回发后填充了GridView的行,我就很难迭代它们。

总之,有两个下拉列表确定应在GridView中显示的数据。该页面最初只加载了两个下拉列表,在此阶段没有GridView。从下拉列表中选择值后,用户通过按钮提交页面。然后,代码调用db来检索数据并将其绑定到GridView。我设法让这个工作!

问题是GridView有一列,用户可以在其中编辑itemtemplate中保存的文本框中的值。如果用户更改文本框中的值并提交页面,当我尝试迭代GridView的行时,它告诉我没有要迭代的行。当我能看到前端可用的行和数据时,我很困惑为什么会发生这种情况。

但是,如果我们删除涉及用户选择下拉列表并且在初始page_load上填充GridView的步骤,我实际上可以遍历行。

因此,如果GridView绑定在按钮点击事件中,那么就好像ViewState没有持久化回发之间的行数。

有人可以向我解释一下发生了什么。

这是VB.NET中的代码:

Protected Sub Me_Load(ByVal sender As Object, ByVal e As EventArgs) _
Handles Me.Load

End Sub

Protected Sub BtnGetData_Click(ByVal sender As Object, ByVal e As EventArgs) _
Handles BtnGetData.Click

    Dim ddlFirstValue As Integer = DropDownListOne.SelectedValue
    Dim ddlSecondValue As Integer = DropDownListSecond.SelectedValue
    MyGridView.DataSource = GetData(ddlFirstValue, ddlSecondValue)
    MyGridView.DataBind()

End Sub

Protected Sub BtnSubmit_Click(ByVal sender As Object, ByVal e As EventArgs) _
Handles BtnSubmit.Click

    For Each row As GridViewRow In MyGridView.Rows 'this returning 0 rows
        'Do something
    Next

End Sub

1 个答案:

答案 0 :(得分:0)

认为我们可能需要更多数据来描述在特定情况下行为发生的原因。例如,您可能考虑发布您的ASPX(XHTML)文件,以便我们更好地了解您的具体情况。

虽然我可能不完全了解您的需求,但似乎您想要的是可能的。下面是一个人为的例子,我把它放在一起,以松散地模拟我的对你的情况的理解。

我提交的代码允许用户:

  1. 使用空GridView打开页面
  2. 从DropDown中选择一个重量过滤器(没有回发)
  3. 从另一个DropDown中选择一个成本过滤器(无回发)
  4. 按下获取数据按钮以填充GridView
  5. 在TextBox中为每个GridView行上的Description字段键入信息
  6. 点击提交按钮
  7. 通过服务器端修改文字控件
  8. 来观察用户的选择

    由于处理发生在服务器上,我认为这段代码表明应该可以以预定的方式修改GridView并读取GridView的更改。

    如果此代码未描述您的情况,请添加评论,以便社区可以为您提供更好的帮助:

    ASPX模拟文件

    <%@ Page Language="VB" AutoEventWireup="false" 
    CodeFile="Default.aspx.vb" Inherits="_Default" %>
    
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title>
        Demo of using DropDown Lists to Filter Data for 
        Editable DataGrid
        </title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <asp:Literal ID="theLiteral" runat="server" />
        </div>
        <br />
        <div>
            <asp:GridView ID="myGridView" runat="server" 
            AutoGenerateColumns="false" 
            DataKeyNames="weight, cost, Description">
                <Columns>               
                    <asp:BoundField DataField="weight" HeaderText="Weight" /> 
                    <asp:BoundField DataField="cost" HeaderText="Cost" /> 
                    <asp:TemplateField HeaderText="Description">
                        <ItemTemplate>
                            <asp:TextBox runat="server" ID="descId"
                            Text='<%# Bind("Description") %>' />                          
                        </ItemTemplate>
                    </asp:TemplateField>
                </Columns>
            </asp:GridView><br />
            Get Items With Weight >=:<br />
            <asp:DropDownList ID="DropDownListOne" runat="server">
                <asp:ListItem Text="1" Value="1" />            
                <asp:ListItem Text="2" Value="2" />      
                <asp:ListItem Text="5" Value="5" />                  
            </asp:DropDownList><br />
            Get Items With Cost >=:<br />
            <asp:DropDownList ID="DropDownListSecond" runat="server">
                <asp:ListItem Text="1" Value="1" />            
                <asp:ListItem Text="5" Value="5" />      
                <asp:ListItem Text="51" Value="51" />    
                <asp:ListItem Text="101" Value="101" />                                
            </asp:DropDownList><br />
            <asp:Button ID="BtnGetData" runat="server" Text="Get Data" /><br />
            <asp:Button ID="BtnSubmit" runat="server" Text="Submit" /><br />
        </div>
        </form>
    </body>
    </html>
    

    模拟文件背后的代码

    ' Just some DataItem to stick in an IEnumerable Array to be 
    ' bound to CreativeInCode's MyGridView
    public Class InventoryItem
        Public Sub New (
            ByVal iWeight As Integer, 
            ByVal iCost As Integer, 
            ByVal iDescription As String) 
    
            weight = iWeight
            cost = iCost
            description = iDescription
        End Sub
    
        ' Automatic VB.NET properties can be read about here:
        ' http://msdn.microsoft.com/en-us/library/dd293589.aspx
        Public Property weight As Integer
        Public Property cost As Integer
        Public Property description As String
    End Class
    
    ' The code behind for Default.aspx starts here
    Partial Class _Default
        Inherits System.Web.UI.Page
    
        ' Data to play with 
        Public storeItems As InventoryItem() = 
        {
            New InventoryItem(10, 20, "PaperWeight"), 
            New InventoryItem(1, 1, "Feather"), 
            New InventoryItem(2000, 20000, "Used SUV"), 
            New InventoryItem(3, 50, "Biology TextBook"), 
            New InventoryItem(1, 200, "Professional Isolation Headphones"), 
            New InventoryItem(1, 100, "Caviar (Does this Need to Be Refrigerated?)")
        }
    
        ' Function to simulate retrieval from DataBase
        Protected Function GetData( _ 
            ByVal weight As Integer, 
            ByVal cost As INteger
        ) As IEnumerable(Of InventoryItem)
            ' Example of LINQ can be found here
            ' http://msdn.microsoft.com/en-us/vstudio/bb688088.aspx
            ' I believe LINQ is the way of the future
            Dim returnValue As IEnumerable(Of InventoryItem) = 
                From items In storeItems
                Where (items.weight >= weight) AndAlso (items.cost >= cost)
                Select items
            Return returnValue
        End Function
    
         ' CreativeInCode's STuff starts here
        Protected Sub Me_Load(ByVal sender As Object, ByVal e As EventArgs) _ 
            Handles Me.Load 
    
        End Sub 
    
        Protected Sub BtnGetData_Click(ByVal sender As Object, ByVal e As EventArgs) _ 
            Handles BtnGetData.Click 
    
            Dim ddlFirstValue As Integer = DropDownListOne.SelectedValue 
            Dim ddlSecondValue As Integer = DropDownListSecond.SelectedValue                 
            MyGridView.DataSource = GetData(ddlFirstValue, ddlSecondValue) 
            myGridView.DataBind()
    
        End Sub 
    
        ''' <summary>
        ''' Made some modifications to CreativeInCode's function to 
        ''' dump the output to the user
        ''' </summary>                
        Protected Sub BtnSubmit_Click(ByVal sender As Object, ByVal e As EventArgs) _ 
            Handles BtnSubmit.Click 
    
            Dim outputToUser As String = _
                "The user put the following values in the GridView:<br />" 
            For Each row As GridViewRow In MyGridView.Rows 'this returning 0 rows 
                'Do something 
    
                ' This is just here to make a good place to set a 
                ' breakpoint            
                Dim weightStr As String = row.Cells(0).Text
                Dim costStr As String = row.Cells(1).Text
                Dim tbDescription As TextBox = row.FindControl("descId")
                Dim description As String = tbDescription.Text
    
                outputToUser &= 
                    String.Format(
                        "weight={0}, cost={1}, description={2}<br />", _
                        weightStr, _ 
                        costStr, _
                        description
                    )           
            Next 
    
            ' Show the user the changes she/he made to the GridView
            theLiteral.Text = outputToUser
        End Sub 
    End Class