这个问题似乎很简单,但我找不到答案。我确定我错过了一些东西。
我想将数据绑定控件(例如 ListView)与在项目模板内执行回发(按钮)的控件一起使用。我希望按钮对此项中的数据执行一些操作。
代码如下所示:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebFormListCommand.aspx.cs"
Inherits="TestWebApplication.WebFormListCommand" %>
<!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></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ListView ID="lvTest" runat="server" EnableViewState="false"
onitemdatabound="lvTest_ItemDataBound" onitemcommand="lvTest_ItemCommand">
<ItemTemplate>
<br />
<asp:Button ID="btnTest" runat="server" />
</ItemTemplate>
</asp:ListView>
</div>
</form>
</body>
</html>
后面的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace TestWebApplication
{
public partial class WebFormListCommand : System.Web.UI.Page
{
protected void Page_Init(object sender, EventArgs e)
{
if (!IsPostBack)
{
lvTest.DataSource = Enumerable.Range(0, 5);
lvTest.DataBind();
}
else
{
lvTest.DataSource = Enumerable.Range(5, 5);
lvTest.DataBind();
}
}
protected void Page_Load(object sender, EventArgs e)
{
}
protected void lvTest_ItemDataBound(object sender, ListViewItemEventArgs e)
{
Button button = (Button)e.Item.FindControl("btnTest");
int value = (int)e.Item.DataItem;
button.CommandName = "someCommand";
button.CommandArgument = value.ToString();
button.Text = value.ToString();
}
protected void lvTest_ItemCommand(object sender, ListViewCommandEventArgs e)
{
//e.CommandArgument has the new value from the new databinding
}
}
}
问题是当按下按钮时,e.CommandArgument 具有来自回发数据绑定的值。如果我在回发时不进行数据绑定,则根本不会引发事件。在大多数情况下,这不是问题,因为您将数据绑定到相同的数据。但是,如果一个用户删除了例如项目 3,而第二个用户决定同时删除项目 3,那么第二个用户实际上将删除第四个项目,因为这些项目将在回发时重新排序。如果启用 ViewState 可以避免这种情况,但应该可以在没有 ViewState 的情况下执行命令(毕竟 ViewState 应该避免的一个地方是数据绑定控件)。雪上加霜,我可以清楚地看到原始(正确)值已发布到服务器。可以通过 Request.Form["lvTest$ctrl2$btnTest" 检索
我尝试了多种方法将命令应用于正确的项目,例如使用按钮单击而不是项目命令、使用 DataKeys 等,但我无法获得数据项的正确值。似乎数据绑定控件总是使用行号来获取命令参数,而不是浏览器实际发布的值。我发现的唯一方法是手动查看 Request.Form 集合,但这似乎不正确。当然,我可以通过连接一个 JavaScript 函数和一个 AJAX 调用来解决这个问题,但我想知道如何以纯 WebForms 的方式解决这个问题。我错过了什么?