2010-02-28 165 views
1

我有一个绑定到AccessDataSource的GridView控件。选择一行后,我在选定的行内创建一个表格。我将Buttons添加到此表中。他们的Click事件永远不会被解雇。我读过关于重新创建按钮和内容的问题,但仍然没有解决问题的运气。感谢帮助!GridView中的动态按钮 - Button.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 
+0

您createQuestionsTable方法和所添加的动态按钮的事件,所以你在页面生命周期很晚添加此按钮。您必须在最多的Page_Load事件中创建按钮和事件才能正常工作。在Page_Load之后的任何控件(如按钮和添加事件)都不会适当地触发事件处理程序。 – 2013-01-18 07:47:00

回答

0

我讨厌回答我的问题,但我希望能够节省任何时间查看问题。事实证明,该误差是在如果条件:

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等于真,从未执行。

正确的代码是:的Page_Load后调用

if (e.Row.RowType == DataControlRowType.DataRow && e.Row.DataItem != null && !IsPostBack) 
{ 
    // ... 
} else if (e.Row.RowType == DataControlRowType.DataRow && IsPostBack) 
{ 
    // ... 
} 
0

尝试分配命令名称,并连接到电网的RowCommand事件监听按钮的点击,作为替代点击点击事件。

+0

我为submit_button分配了一个commandName,并向GridView添加了一个RowCommandEventHandler。点击该按钮会产生一个简单的回传。 我也尝试在.aspx代码中添加一个asp:buttonfield。 buttonfield正确地发射了该事件。点击我的旧按钮,然后用一个不正确的命令名提升RowCommand事件 - buttonfield的命令名。 – harpun 2010-02-28 18:04:03

+0

哇,好吧,这很奇怪...尝试在按钮上设置UseSubmitBehavior为false,所以它会使用__doPostBack方法来回传... – 2010-03-01 13:43:50

+0

我做了submit_button.CommandName =“SUBMIT”; submit_button.UseSubmitBehavior = false;和“void SurveyGridView_RowCommand(对象发件人,GridViewCommandEventArgs e)”仍然不会被解雇...... – harpun 2010-03-04 22:10:54