Событие нажатия кнопки не работает внутри элемента управления повторителем

Я работаю над проектом, в котором я использую элемент управления повторителем, и в его событии, связанном с данными, я добавляю некоторые данные и две кнопки -edit и delete. Но событие нажатия моих кнопок не работает, и когда я нажимаю любую из этих двух кнопки данных моего репитера исчезают.

Ниже мой код

protected void fillrptmapping()
{
    ds = objcce1.selectSubject(schoolcode);
    rptmapping.DataSource = ds;
    rptmapping.DataBind();
}
protected void rep_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
    {
        Label lblsubcode = (Label)e.Item.FindControl("lblsubcode");
        Table tblmapping = (Table)e.Item.FindControl("tblmapping");
        int subcode =Convert.ToInt32(lblsubcode.Text.ToString());
        DataSet ds1 = new DataSet();
        ds1 = objcce1.selectSubjectskillmapping(schoolcode);
        DataSet ds2 = new DataSet();
        ds2 = objcce1.selectAssessfullmapping(schoolcode);
        DataRow[] dr1;
        DataRow[] dr2;

                TableRow tr = new TableRow();
                tr.Width = 300;
                TableCell tc = new TableCell();
                tr.Width = 300;
                tc.Height = 100;
                //selecting skillmappingcodes
                dr1 = ds1.Tables[0].Select("subjectgroupcode='" + subcode + "'");
                for (int j = 0; j < dr1.Length; j++)
                {
                    Label lblskill = new Label();
                    lblskill.CssClass = "lblskilltxt";
                    lblskill.Text = dr1[j]["skillname"].ToString() + "<br/>";
                    tc.Controls.Add(lblskill);
                    dr2 = ds2.Tables[0].Select("skillmappingcode='" + dr1[j]["skillmappingcode"] + "'");
                    for (int k = 0; k < dr2.Length; k++)
                    {
                        ImageButton imgedit = new ImageButton();
                        imgedit.ImageUrl = "../Images/edit.jpg";
                        imgedit.Width = 25;
                        imgedit.Height = 25;
                        imgedit.ID = dr2[k]["assessmentareamappingcode"].ToString();
                        imgedit.Click += new ImageClickEventHandler(imgeditassessmapping_OnClick);
                        //Button btnedit = new Button();
                        //btnedit.ID = dr2[k]["assessmentareamappingcode"].ToString();
                        //btnedit.Click += new System.EventHandler(this.imgeditassessmapping_OnClick);
                        ImageButton imgdelete = new ImageButton();
                        imgdelete.Width = 25;
                        imgdelete.Height = 25;
                        imgdelete.ImageUrl = "../Images/delete.jpg";
                        imgdelete.Click += new ImageClickEventHandler(this.imgdeleteassessmapping_OnClick);
                        Label lblarea = new Label();
                        lblarea.Text = dr2[k]["assessmentareaname"].ToString() + "<br/><br/>";
                        tc.Controls.Add(btnedit);
                        tc.Controls.Add(imgdelete);
                        tc.Controls.Add(lblarea);
                    }
                }
                //selecting subjectgroup in area table
                dr2 = ds2.Tables[0].Select("subgroupcode='" + subcode + "'");
                for (int l = 0; l < dr2.Length; l++)
                {
                    ImageButton imgedit = new ImageButton();
                    imgedit.Width = 25;
                    imgedit.Height = 25;
                    imgedit.ImageUrl = "../Images/edit.jpg";
                    imgedit.Click += new ImageClickEventHandler(this.imgeditassessmapping2_OnClick);
                    ImageButton imgdelete = new ImageButton();
                    imgdelete.Width = 25;
                    imgdelete.Height = 25;
                    imgdelete.ImageUrl = "../Images/delete.jpg";
                    imgdelete.Click += new ImageClickEventHandler(this.imgdeleteassessmapping2_OnClick);
                    Label lblarea = new Label();
                    lblarea.Text = dr2[l]["assessmentareaname"].ToString() + "<br/>";
                    tc.Controls.Add(imgedit);
                    tc.Controls.Add(imgdelete);
                    tc.Controls.Add(lblarea);
                }
                tr.Cells.Add(tc);
                tblmapping.Rows.Add(tr);            
    }
}
protected void imgeditassessmapping_OnClick(object sender,EventArgs e)
{
    Button img = sender as Button;
    string assessmappingcode = img.ID;
    ds =objcce1.selectAssessSkill(schoolcode, assessmappingcode);
    foreach (ListItem item in drpsubjectoption.Items)
    {
        if (item.Value == ds.Tables[0].Rows[0]["subjectgroupcode"].ToString())
        {
            item.Selected = true;
        }
    }
    rblmapping.SelectedIndex = 0;
    spanskill.Visible = true;
    drpmappingskill.Visible = true;
    foreach (ListItem item in drpmappingskill.Items)
    {
        if (item.Value == ds.Tables[0].Rows[0]["skillcode"].ToString())
        {
            item.Selected = true;
        }
    }
    pnlassessmapping.Visible = true;
    foreach (ListItem item in drpassessmapping.Items)
    {
        if (item.Value == ds.Tables[0].Rows[0]["assessmentareacode"].ToString())
        {
            item.Selected = true;
        }
    }
    foreach (ListItem item in drpmarkingtype.Items)
    {
        if (item.Text == ds.Tables[0].Rows[0]["type"].ToString())
        {
            item.Selected = true;
        }
    }
    foreach (ListItem item in rbldesc.Items)
    {
        if (item.Text == ds.Tables[0].Rows[0]["desindreq"].ToString())
        {
            item.Selected = true;
        }
    }
    btnsavemapping.Text = "Update";
}
protected void imgdeleteassessmapping_OnClick(object sender,ImageClickEventArgs e)
{
}

ASPX код страницы

<asp:Repeater ID="rptmapping" runat="server" OnItemDataBound="rep_ItemDataBound" >
                    <HeaderTemplate></HeaderTemplate>
                    <ItemTemplate>
                        <table>
                            <tr>
                                <td>
                                    <asp:Label ID="lblsubcode" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "subgroupcode")%>'></asp:Label>
                                    <asp:Label ID="lblsubject" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "subname")%>'></asp:Label>
                                    <asp:Button ID="Button1" runat="server" Text="Button" OnClick="imgeditassessmapping_OnClick"/>
                                </td>
                            </tr>   
                            <tr>
                                <td>
                                    <asp:Table ID="tblmapping" runat="server" Width="300" BorderColor="Black" GridLines="both"></asp:Table>
                                </td>
                            </tr>                         
                         </table>
                    </ItemTemplate>
                </asp:Repeater>

Снимок экрана до нажатия кнопки

Снимок экрана после нажатия кнопки

1 ответ

Вы должны понимать, как генерируются ваши динамические элементы управления. Они должны генерироваться с одинаковыми идентификаторами каждый раз, когда загружается ваша страница (т.е. при первой загрузке и при последующих загрузках / повторных отправках).

Если кнопка не существует (не была сгенерирована) на этапе жизненного цикла страницы, на котором она запускает обработчики событий (например, события нажатия кнопки), то обработчик событий не сработает.

В целом, симптомы говорят о том, что ваш обработчик события ItemDataBound не запускается при обратной передаче; Вы можете связывать данные, только если запрос не является обратной передачей. Получение события, инициируемого при каждом запросе страницы, поможет, но в целом было бы лучше, если бы вы всегда имели эти кнопки на странице, а не генерировали их динамически. Это даст вам более надежный обработчик событий.

Другие вопросы по тегам