[英]Dynamic buttons in GridView - Button.Click event not firing
我有一个绑定到AccessDataSource的GridView控件。 选择一行后,我将在所选行中创建一个表。 我要在此表中添加按钮。 他们的Click事件永远不会被解雇。 我读到有关重新创建按钮和内容的信息,但仍然无法解决问题。 感谢帮助!
.aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="AdminSurvey.aspx.cs" Inherits="AdminSurvey" %>
<!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">
<asp:GridView ID="id_survey_grid_view" runat="server" DataSourceID="id_access_data_source"
SkinID="default_skin" AllowSorting="True" AutoGenerateColumns="false"
OnRowCreated="SurveyGridView_RowCreated">
<Columns>
<asp:HyperLinkField HeaderText="Title" SortExpression="TITLE"
DataTextField="TITLE" DataNavigateUrlFields="SURVEY_ID"
DataNavigateUrlFormatString="~\AdminSurvey.aspx?survey_id={0}">
</asp:HyperLinkField>
</Columns>
</asp:GridView>
<asp:AccessDataSource ID="id_access_data_source" runat="server" DataFile="~/App_Data/database.mdb"
OldValuesParameterFormatString="original_{0}"
OnLoad="InitAccessDataSource">
</asp:AccessDataSource>
</form>
</body>
</html>
.cs:
public partial class AdminSurvey : System.Web.UI.Page
{
private const string ID_BUTTON_SUBMIT = "SUBMIT_BUTTON";
private const string ID_BUTTON_DELETE = "SUBMIT_DELETE";
private string _selected_survey;
protected void SurveyGridView_RowCreated(Object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow && e.Row.DataItem != null && !IsPostBack)
{
string survey = ((DataRowView)e.Row.DataItem).Row.ItemArray[0].ToString();
if (survey.Equals(_selected_survey))
{
e.Row.Cells[0].Controls.Clear();
// create table
e.Row.Cells[0].Controls.Add(createSurveyTable(((DataRowView)e.Row.DataItem).Row.ItemArray[0].ToString(),
((DataRowView)e.Row.DataItem).Row.ItemArray[1].ToString(),
((DataRowView)e.Row.DataItem).Row.ItemArray[2].ToString()));
ViewState["row_index"] = Convert.ToString(e.Row.RowIndex);
ViewState["survey_id"] = ((DataRowView)e.Row.DataItem).Row.ItemArray[0].ToString();
ViewState["title"] = ((DataRowView)e.Row.DataItem).Row.ItemArray[1].ToString();
ViewState["description"] = ((DataRowView)e.Row.DataItem).Row.ItemArray[2].ToString();
}
} else if(e.Row.RowType == DataControlRowType.DataRow && e.Row.DataItem != null && IsPostBack) {
string row_idx = (string)ViewState["row_index"];
if (row_idx != null && e.Row.RowIndex.Equals(Convert.ToInt32(row_idx)))
{
_selected_survey = (string)ViewState["survey_id"];
string title = (string)ViewState["title"];
string description = (string)ViewState["description"];
e.Row.Cells[0].Controls.Clear();
// recreate table
e.Row.Cells[0].Controls.Add(createSurveyTable(_selected_survey, title, description));
}
}
}
private Table createSurveyTable(string survey_id, string title, string description)
{
Table table = new Table();
TableRow row = new TableRow();
TableCell cell = new TableCell();
Table questions_table = createQuestionsTable(survey_id);
cell.Controls.Add(questions_table);
row.Cells.Add(cell);
table.Rows.Add(row);
return table;
}
private Table createQuestionsTable(string survey_id)
{
// submit row
TableRow submit_row = new TableRow();
TableCell submit_cell = new TableCell();
submit_button = new Button();
submit_button.Text = "Submit";
submit_button.ID = ID_BUTTON_SUBMIT;
submit_button.Click += new EventHandler(submitButton_Click);
submit_cell.Controls.Add(submit_button);
delete_button = new Button();
delete_button.Text = "Delete";
delete_button.ID = ID_BUTTON_DELETE;
delete_button.Click += new EventHandler(deleteButton_Click);
submit_cell.Controls.Add(delete_button);
submit_row.Cells.Add(submit_cell);
table.Rows.Add(submit_row);
return table;
}
private void submitButton_Click(object sender, EventArgs e)
{
}
private void deleteButton_Click(object sender, EventArgs e)
}
} // class
我不愿回答我的问题,但我希望它可以节省任何人查看问题的时间。 原来,错误在于if条件:
if (e.Row.RowType == DataControlRowType.DataRow && e.Row.DataItem != null && !IsPostBack)
{
// ...
} else if (e.Row.RowType == DataControlRowType.DataRow && e.Row.DataItem != null && IsPostBack) {
// ...
}
e.Row.DataItem != null
在两个条件中均错误地存在,并且从未执行过第二个条件( IsPostBack
等于true)。
正确的代码是:
if (e.Row.RowType == DataControlRowType.DataRow && e.Row.DataItem != null && !IsPostBack)
{
// ...
} else if (e.Row.RowType == DataControlRowType.DataRow && IsPostBack)
{
// ...
}
尝试分配命令名称,并附加到网格的RowCommand事件以监听按钮的单击,以替代点击事件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.