我认为我们可能需要更多数据来描述为什么在您的特定情况下会发生这种行为。例如,您可能会考虑发布您的 ASPX (XHTML) 文件,以便我们更好地了解您的具体情况。
虽然我可能不完全理解您的需求,但您想要的似乎是可能的。下面是我整理的一个人为的示例,以大致模拟我对您的情况的理解。
我提交的代码允许用户:
- 打开带有空 GridView 的页面
- 从下拉列表中选择权重过滤器(尚无回发)
- 从另一个下拉列表中选择成本过滤器(尚无回发)
- 按下获取数据按钮以填充 GridView
- 在每个 GridView 行上的描述字段的文本框中键入信息
- 点击提交按钮
- 通过服务器端对文字控件的修改来观察用户的选择
由于处理发生在服务器上,我认为这段代码表明应该可以以规定的方式修改 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