#c# #asp.net #repeater
#c# #asp.net #повторитель
Вопрос:
Я относительно новый разработчик и занимаюсь этим всего около 6 месяцев на постоянной основе, поэтому заранее благодарю вас за чтение и / или ответ на мой вопрос
У меня есть ретранслятор с привязкой к данным. Внутри этого ретранслятора у меня есть gridview, SQLDS и 2 флажка. Оба флажка имеют событие onCheckedChanged, и для AutoPostBack установлено значение true. Повторитель также имеет событие OnItemDataBound.
Вот пример того, как изложен мой код:
<asp:Repeater ID="Repeater1" OnItemDataBound="Repeater1_ItemDataBound">
<ItemTemplate>
<asp:Panel>
<asp:UpdatePanel>
<ContentTemplate>
<asp:Checkbox ID="Checkbox1" Autopostback="True" OnCheckedChanged="CheckBox1_CheckedChanged">
<asp:Checkbox ID="Checkbox2"Autopostback="True" OnCheckedChanged="CheckBox2_CheckedChanged">
<asp:Gridview ID="Gridview1" DataSourceID="SqlDataSource1">
<asp:SQLDataSource ID="SQLDataSource1" SelectCommand="SP1" SelectCommandType="StoredProcedure">
</ContentTemplate>
</asp:UpdatePanel>
</asp:Panel>
</ItemTemplate>
</asp:Repeater>
И C#
protected void Checkbox1_CheckedChanged(object sender, EventArgs e)
{
if (Checkbox1.Checked == true)
{
if (Checkbox2.Checked == true)
SqlDataSource1.SelectCommand = "SP1";
else
SqlDataSource1.SelectCommand = "SP2";
}
else
SqlDataSource1.SelectCommand = "SP3";
}
protected void Checkbox2_CheckedChanged(object sender, EventArgs e)
{
if (Checkbox2.Checked == true)
{
if (Checkbox1.Checked == true)
SqlDataSource1.SelectCommand = "SP3";
else
SqlDataSource1.SelectCommand = "SP2";
}
else
SqlDataSource1.SelectCommand = "SP1";
}
protected void Repeater1_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
//Uses FindControl to Databind the GV and hides it if GV.Rows.Count==0
}
Я делаю все это в панели вкладок AJAX. У меня есть другая страница, где этот код работает отлично, но его нет внутри повторителя на этой другой странице.
По сути, у меня загружается страница с помощью gridview, и два флажка меняют, какой SP заполняет gridview. Проблема, с которой я сталкиваюсь, заключается в том, что когда вы снимаете флажок (они начинают проверяться), он 1. Просто перепроверяет себя и 2. Не попадает в событие CheckedChanged.
Любая помощь будет принята с благодарностью.
Комментарии:
1. Я не вижу, чтобы флажки, связанные с обработчиками событий и autpostback, были установлены в true. Можете ли вы показать, где вы это делаете?
2. Да, извините. Они установлены как таковые в тегах ASP.
Ответ №1:
Вам необходимо установить AutoPostBack=True
атрибут для флажков, а также зарегистрировать / назначить обработчики событий для всех элементов управления, которые добавляются в UpdatePanel через Triggers
свойство элемента управления UpdatePanel.
Комментарии:
1. Я сделал именно это, установил
AutoPostBack=True
, а также настроил триггеры на UpdatePanel в форме<asp:AsyncPostBackTrigger ControlID="Checkbox1" EventName="CheckedChanged" />
и<asp:AsyncPostBackTrigger ControlID="Checkbox2" EventName="CheckedChanged" />
— Проблема остается с флажками, не попадающими в их события checkedchanged .
Ответ №2:
Автоматическая обратная отправка флажков приводит к тому, что SqlDataSource просто возвращается к исходной хранимой процедуре, поскольку она попадает на загрузку страницы и просто игнорирует события oncheckchanged.
Что я сделал, так это то, что я взял все свои события привязки данных в pageload и поместил их внутрь if (!IsPostBack)
предложения, чтобы при выполнении автоматической обратной отправки он не привязывал SQLDS к исходному значению.
Таким образом, когда происходит автоотправка, ему нечего делать, и он попадает в события onCheckedChanged, как и предполагалось.
Спасибо всем за чтение и ответы.
Ответ №3:
ASP.NET У ретранслятора есть событие, которое вызывает повторный переход от клиента к клиенту. Событие называется ItemCommand . Проверьте эту ссылку:- http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.repeater.itemcommand.aspx
Надеюсь, это поможет
Комментарии:
1. Похоже, это было бы полезно, но я не уверен, как это реализовать.
OnCheckedChanged
Событиям нужны свои собственные методы, поэтому я не уверен, что поместить вRepeater1_ItemCommand
метод.
Ответ №4:
я нашел похожую проблему и решил
С уважением
Комментарии:
1. Я тоже видел эту ссылку и попытался ее реализовать. Это не решает проблему «повторной проверки непроверенной ссылки».
Ответ №5:
Сначала вам нужно вывести UpdatePanel
внешнюю часть ретранслятора и добавить runat="server"
. Вы также должны перенести элемент управления источником данных за пределы ретранслятора и повторно использовать его для всех просмотров сетки внутри ретранслятора.
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Repeater ID="Repeater1" runat="server">
<ItemTemplate>
<!-- checkboxes -->
<!-- gridview -->
</ItemTemplate>
</asp:Repeater>
</ContentTemplate>
</asp:UpdatePanel>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ...>
Комментарии:
1. @RockiesMagicNumber: Пожалуйста, посмотрите мой ответ. Я думаю, это решит вашу проблему.
Ответ №6:
На самом деле ваш метод привязки данных, вероятно, вызывается вне условия if(!ISPOSTBACK) { }, поэтому вызовите этот метод внутри блока ispostback, я надеюсь, что ваша проблема будет решена.