Аналогично этому вопросу здесь Событие динамической кнопки команды ASP.Net не срабатывает , но с немного другой проблемой.
Ниже приводится (очень) сжатая версия моего кода.
protected void Page_Load(object sender, EventArgs e)
{
RenderDataItems();
}
private void RenderDataItems()
{
pnlDataItems.Controls.Clear()
DataTable dt = MyClass.GetAllData();
foreach (DataRow dr in dt.Rows)
{
Button b = new Button();
b.Command += new CommandEventHandler(SelectItem);
b.CommandArgument = dr["ID"].ToString();
b.ID = "btnData" + dr["ID"].ToString();
if (hdnDataListID.Value == dr["ID"].ToString())
{
b.Text = "Selected Item";
}
else
{
b.Text = "Pick This Item";
}
pnlDataItems.Controls.Add(b);
}
}
private void SelectItem(object sender, CommandEventArgs e)
{
hdnDataListID.Value = e.CommandArgument.ToString();
RenderDataItems();
}
private void EditSelectItem(int id)
{
MyClass mc = new MyClass(id);
hdnDataListID.Value = mc.ID.ToString();
RenderDataItems();
}
Метод SelectItem
вызывается только с помощью элементов управления кнопки, отображаемых в методе RenderDataItems
.EditSelectItem
вызывается отдельным элементом управления, который создается динамически, но не требует изменения, которого требуют кнопки в методе RenderDataItems
.
Я запустил отладчик и прошел через код, чтобыпосмотрим что получитсяКогда страница загружена, RenderDataItems
вызывается из PageLoad
и заполняет панель всеми кнопками, имеющими «Pick This Text» (потому что значение элемента управления HiddenField (hdnDataListID
) не было установлено).
В первый раз, когда я нажимаю одну из кнопок, срабатывает RenderDataItems
из PageLoad
, затем идет начальное заполнение кнопок, значение HiddenField устанавливается на идентификатор, а второй RenderDataItems
вызываетсяпроисходит изнутри SelectItem
метод.Кнопки очищены и воссозданы.Правильная кнопка имеет текст «Выбранный элемент».
Во второй раз, когда я нажимаю одну из кнопок, запускается RenderDataItems
из PageLoad
, за которым следует начальное заполнение кнопок, но SelectItem
метод никогда не срабатывает.
В третий раз, когда я нажимаю одну из кнопок, происходит та же функциональность, что и в 1-й раз.4-й имитирует 2-й.5-й имитирует 1-й.И так далее, и так далее.
При использовании метода EditSelectItem
из элементов управления, не содержащихся на панели (это строка GridView с привязкой к DataSource с кнопками, вызывающими этот метод), он работает точно так же, как я 'Я ожидал и правильно устанавливал выбранные / невыбранные кнопки, каждый раз вызывая методы RenderDataItems
и EditSelectItem
.
Есть идеи?
PS Я уже удалил всемоего AJAX на этой странице.