我仍然是 asp.net 的新手,所以我确信有更好的方法来做这件事......
我想允许用户输入日期,然后对数据库执行 SQL 查询以返回与该日期匹配的所有记录。我想显示这些记录,并允许用户选择一个进行额外处理。看起来带有一列按钮的 DataGrid 是一个不错的选择。事实上,我以前也这样做过,但在那些情况下不涉及用户交互。该页面只是运行了一个固定的 SQL 查询。使用我现在正在做的事情,数据按我的意愿显示,但是按钮不起作用...... ItemCommand 事件不会触发。
我已经阅读了很多关于 ItemCommand 事件未触发的线程,但我仍然无法让它工作。我的理解是我需要在不在回发中绑定 DataGrid,我认为我的代码可以做到这一点。当我调试 Page_Load 事件时,我可以看到if (!IsPostBack){}内部的代码正在运行,并且会话变量具有预期的数据。
在承载 DataGrid 的页面上,我有一个“查找”按钮,用于对数据库执行 SQL 查询。该查询使用输入到该页面上的文本框中的日期。在“查找”按钮单击事件中,我将查询结果(数据表)存储在会话变量中,然后执行重定向以重新加载页面。
页面重新加载后,会话变量将包含我预期的数据,并且数据与按钮一起显示在 DataGrid 中。当我单击 DataGrid 中的任何按钮时,DataGrid 的内容消失并且 ItemCommand 事件不会触发。
这是 DataGrid 的定义(更新为包含按钮):
<asp:Panel runat="server" ID="pnlSelect" HorizontalAlign="Left" Visible="true" style="margin-top:10px" >
Please select a participant.
<asp:DataGrid runat="server" ID="grdItems" AutoGenerateColumns="true" BorderColor="black" BorderWidth="1" CellPadding="3" style="margin-left:2px; margin-top:6px" OnItemCommand="grdSelect_ItemCommand" >
<Columns>
<asp:ButtonColumn HeaderStyle-HorizontalAlign="Center" ButtonType="PushButton" Text="Select" HeaderText="Select" CommandName="Select" >
<ItemStyle Width="60px" HorizontalAlign="Center"/>
</asp:ButtonColumn>
</Columns>
</asp:DataGrid>
</asp:Panel>
这是页面加载代码(不需要的代码隐藏内容被注释掉):
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if (Session["y"] != null)
{
txtFind.Text = Session["x"].ToString();
DataTable table = Session["y"] as DataTable;
Session.Remove("x");
Session.Remove("y");
if (table != null)
{
/*
ButtonColumn buttonColumn = new ButtonColumn
{
HeaderText = "Select",
Text = "Select",
CommandName = "Select",
ButtonType = ButtonColumnType.PushButton,
};
grdItems.Columns.Add(buttonColumn);
foreach (DataColumn c in table.Columns)
{
BoundColumn column = new BoundColumn
{
HeaderText = c.Caption,
DataField = c.Caption,
ReadOnly = true
};
grdItems.Columns.Add(column);
}
*/
grdItems.DataSource = table;
grdItems.DataBind();
}
}
}
}
这是相关的“查找”按钮事件代码。我无法发布 sql 查询文本的详细信息,但该部分确实有效,并且 DataTable 确实包含预期的数据:
DataTable table = DatabaseHelper.FindBySQL(sqlText);
if (table != null && table.Rows.Count > 0)
{
Session["x"] = searchtext;
Session["y"] = table;
Response.Redirect(Request.RawUrl, true);
}
这就是 ItemCommand 事件。我在第一行放置了一个断点,调试器永远不会命中它。
protected void grdItems_ItemCommand(object source, DataGridCommandEventArgs e)
{
string item = "";
switch (e.CommandName.ToLower())
{
case "select":
item = e.Item.Cells[1].Text.Trim();
//todo: handle the selected data
break;
}
}
感谢您的任何想法。
大学教师