Событие нажатия кнопки не работает внутри элемента управления повторителем
Я работаю над проектом, в котором я использую элемент управления повторителем, и в его событии, связанном с данными, я добавляю некоторые данные и две кнопки -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 не запускается при обратной передаче; Вы можете связывать данные, только если запрос не является обратной передачей. Получение события, инициируемого при каждом запросе страницы, поможет, но в целом было бы лучше, если бы вы всегда имели эти кнопки на странице, а не генерировали их динамически. Это даст вам более надежный обработчик событий.