【发布时间】:2021-08-16 05:03:43
【问题描述】:
我们有一个可以编辑的网格视图,这个网格视图由RegularSearch() 或SearchById(string Id) 填充。
这是代码:
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
string empId = Request.QueryString["EmpId"];
if (!string.IsNullOrEmpty(empId))
{
SearchByEmpId(empId);
}
else
{
RegularSearch();
}
}
}
protected void GridView_EmpId_RowEditing(object sender, GridViewEditEventArgs e)
{
GridView_EmpId.EditIndex = e.NewEditIndex;
string empId = Request.QueryString["empId"];
if (!string.IsNullOrEmpty(empId))
{
SearchByEmpId(empId);
}
else
{
RegularSearch();
}
// Start editing gridview row
}
当我访问页面 Employees.aspx?empId=ABC123 时,SearchByEmpId(empId) 被调用并且网格将显示一行。当我单击“编辑”时,GridView_EmpId_RowEditing 将通过SearchByEmpId(empId); 重新绑定网格视图,我将使用empid 编辑一行。没关系。
我编辑该行,然后单击“搜索”按钮,该按钮将调用 RegularSearch();。结果,比如 200 行,将显示在网格中。
问题是当我编辑一行时,GridView_EmpId_RowEditing 将被调用,它会重新检查查询字符串。由于Request.QueryString["EmpId"] 将具有上一个请求的值,因此GridView_EmpId_RowEditing 将使用SearchByEmpId(empId); 而不是RegularSearch(); 绑定gridview。
有很多方法可以解决这个问题(例如会话变量或视图状态),但必须有更优雅的方法来解决这个问题。
【问题讨论】:
-
通常,在编辑方法中,我会从所选行的数据而不是查询参数中获取记录 ID。也就是说,您可能可以使用属性保留您所拥有的并将其绑定到 ViewState。
-
我建议您在进行搜索或点击搜索按钮时,清除 url 参数。例如:codeproject.com/Tips/177679/…
-
为什么要结束这个问题?
-
为什么要结束这个问题?好吧,推测密切选民的想法,我突然想到:必须有一个更优雅的方法来解决这 - “优雅”是见仁见智的问题,而不是事实。请参阅this Meta question,了解为什么不鼓励这些。在您的问题中,您甚至说 有很多方法可以解决问题 - 所以您可以根据自己的标准选择一种。
-
我只会在第一页回发时使用过滤器。对于任何其他,使用 viewstate - 并且可能/将包括行编辑事件。因此,在页面加载时,将查询值移动到视图状态中,所有过滤器代码现在都适用于 ViewState("MyFilter")。这意味着如果你清除,或者再次搜索,或者其他什么?您可以清除或重新设置 ViewState("MyFilter") = "" 或其他任何东西。因此,在第一次发布到页面时(postback = false),然后像您一样,但是将查询过滤器值移动到视图状态 - 因此所有附加代码都可以使用视图状态 - 您可以随意清除/设置/重置。