Событие onCheckedChanged не срабатывает, когда установлены флажки внутри ретранслятора

#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:

я нашел похожую проблему и решил

http://www.codeproject.com/Questions/88960/OnCheckedChanged-Event-for-the-checkbox-inside-the/?cmt=3621

С уважением

Комментарии:

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, я надеюсь, что ваша проблема будет решена.