Нажатие флажка вызывает срабатывание onCheckedChanged дважды - PullRequest
1 голос
/ 19 декабря 2008

У меня есть GridView с TemplateField с флажком. Моя цель - захватить событие onclick с помощью автостопбэка и установки флага базы данных. Моя единственная проблема заключается в том, что пожар в два раза. Первый раз флажок (в параметре отправителя) содержит значение, по которому щелкнули, поэтому я установил его на основе щелчка. Во второй раз параметр отправителя имеет флажок, который всегда проверяется = false. Я рад принять предложения о других подходах к решению этой проблемы, но моя цель состоит в том, чтобы установить флаг базы данных на основе того, что пользователь установил флажок. Я нацеливаюсь на .NET Framework 2.0.

Вот соответствующий код:

<div style="margin-left : 1em;margin-right:1em;">
    <asp:GridView ID="RouteGridView" runat="server" AllowPaging="True" 
            AutoGenerateColumns="False" CellPadding="4" DataKeyNames="ROUTE_NUMBER" 
            ForeColor="#333333" GridLines="None" style="width:100%;" 
        onselectedindexchanged="RouteGridView_SelectedIndexChanged" 
        AllowSorting="True" onpageindexchanging="RouteGridView_PageIndexChanging" 
        onsorting="RouteGridView_Sorting" >
            <Columns>
<%-- Column one --%>
<asp:TemplateField HeaderText="Route" SortExpression="ROUTE_NUMBER">
    <ItemTemplate>
        <asp:LinkButton ID="HyperLink1" runat="server" CommandName="Select" CommandArgument='<%#Eval("ROUTE_NUMBER")%>'  
                            Text='<%# Eval("ROUTE_NUMBER") %>' ></asp:LinkButton>
    </ItemTemplate>
    <ItemStyle HorizontalAlign="Center" />
</asp:TemplateField>

<%-- Column 2 this is where the problem CheckBox is--%>
<asp:TemplateField HeaderText="Read?" 
    SortExpression="READ_FLAG">
    <ItemTemplate>
        <asp:CheckBox ID="CheckBox1" runat="server" 
            OnCheckedChanged="ChangeReadFlag"  
            AutoPostBack="true"
            Checked='<%# (string)DataBinder.Eval(Container.DataItem, "READ_FLAG") == "1" %>' Enabled='<%# isSelectedRow(Container)  %>' />
    </ItemTemplate>
    <ItemStyle HorizontalAlign="Center" />
</asp:TemplateField>

<%-- more columns --%
<%-- more columns --%>
</Columns>
</asp:GridView>

Вот обработчик события из кода:

protected void ChangeReadFlag(object sender, EventArgs e)
{
    if (RouteGridView.SelectedIndex != -1)
    {
        CheckBox cb = ((CheckBox)sender);
        DataKey key = RouteGridView.SelectedDataKey;

        //... do stuff here ...
    }
}

Ответы [ 5 ]

1 голос
/ 27 января 2009

Причин такого поведения может быть несколько. В моем случае событие было зарегистрировано дважды: один раз автоматически как часть определения флажка
<asp:CheckBox ID="CheckBox1" runat="server" **OnCheckedChanged="ChangeReadFlag"** AutoPostBack="true" Checked='<%# (string)DataBinder.Eval(Container.DataItem, "READ_FLAG") == "1" %>' Enabled='<%# isSelectedRow(Container) %>' />

и второй раз - явная регистрация где-то в коде, обычно в методе OnInit:
CheckBox1.CheckedChanged += new EventHandler(ChangeReadFlag);

Чтобы исправить это, вы должны удалить вторую регистрацию либо из кода позади, либо из-под вашего контроля.

1 голос
/ 19 декабря 2008

Устанавливаете ли вы установленный флажок в состояние "ложь" вообще в событии загрузки страницы?

0 голосов
/ 27 января 2009

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

Если вы выполняете привязку данных при обратной передаче и после того, как первое событие onChange сработало, вполне вероятно, что событие привязки данных сбрасывает статус флажка и поэтому вызывает событие снова.

0 голосов
/ 19 декабря 2008

Одной из причин (могут быть и другие) проблемы является то, что событие регистрируется дважды.

Проверьте свой код в указанном коде внутри InitializeComponent. Это приведет к тому, что событие будет зарегистрировано дважды и, следовательно, будет запущено дважды.

Вам нужно удалить его в одном месте, чтобы решить проблему.

Ram.

0 голосов
/ 19 декабря 2008

Вы хотите захватить четность GridView; определите команду (отправителя), которая вызывает обратную передачу, и затем вы сможете выполнить обновление вашей БД.

...