VinKot Ответов: 2

Событие checkedchanged без autopostback элемента управления флажок = истина


I added checkbox control to the GridView column dynamically. On each GridView_RowBound() event, checkbox is being added to the column. Also defined, CheckBox_CheckedChanged event in the RowBound() event as below



<pre>Protected Sub GridviewChildItem_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs)

    If e.Row.RowType = DataControlRowType.DataRow AndAlso Not String.IsNullOrEmpty(CRMSignCond) Then
        Dim lbValue As Label = DirectCast(e.Row.Cells(5).FindControl("lbValue"), Label)
        e.Row.Cells(5).Attributes.Add("onmousemove", "Show('" + lbValue.Text + "')")
        e.Row.Cells(5).Attributes.Add("onmouseout", "this.style.backgroundColor=this.oldcolor;Hide();")
    End If

    AddTemplateControls(Nothing, e)


End Sub
Private Sub AddTemplateControls(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs)
    Dim cbTargetSign As New CheckBox
    Dim rbConsolidate As New RadioButtonList
    Dim tbSignGrp As New TextBox

    cbTargetSign.ID = "chkSelect"
    cbTargetSign.AutoPostBack = False
    cbTargetSign.Checked = True
    rbConsolidate.ID = "rbConsolidate"
    tbSignGrp.ID = "tbSigningGroup"
    tbSignGrp.Width = 25
    If Not e.Row.RowIndex = -1 Then
        e.Row.Cells(6).Controls.Add(cbTargetSign)
        e.Row.Cells(4).Controls.Add(tbSignGrp)
        e.Row.Cells(7).Controls.Add(rbConsolidate)
    End If
    rbConsolidate.RepeatDirection = RepeatDirection.Horizontal
    rbConsolidate.Items.Add("Yes")
    rbConsolidate.Items.Add("No")
    rbConsolidate.Items(1).Selected = CBool(True)
    If cbTargetSign.Checked Then
        rbConsolidate.Enabled = False
    End If
    **AddHandler cbTargetSign.CheckedChanged, AddressOf cbTargetSign_CheckedChanged**
End Sub


Checkbox- CheckedChanged event.

<pre lang="vb">Public Sub cbTargetSign_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs)

End Sub

Каждый раз, когда я устанавливаю флажок в сетке, событие checkedChanged не срабатывает. Кто-нибудь подскажет мне, как это решить ?

Примечание: Я не хочу устанавливать AutoPostBack флажка в TRUE, так как он перезагружает всю сетку со значениями по умолчанию.

Что я уже пробовал:

Я не имею ни малейшего понятия, чтобы двигаться дальше, ожидая руководства.

2 Ответов

Рейтинг:
1

F-ES Sitecore

Вам нужно лучше понять веб-архитектуру и архитектуру asp.net. Ваш серверный код запускается только для генерации html \ js, который затем отправляется клиенту для выполнения, ваш код .net не работает внутри браузера, он не может реагировать на клиентские события. Он может работать только тогда, когда вы выполняете обратную передачу, что означает установку AutoPostBack на true и повторную публикацию всей страницы. Если вы не хотите, чтобы страница обновлялась в браузере, вы можете использовать UpdatePanel, который вместо этого преобразует событие флажка в вызов ajax. Жизненный цикл страницы по-прежнему будет выполняться, но браузер обновит только компоненты в UpdatePanel. В остальном это случай написания собственного кода ajax.


VinKot

Спасибо за ваши комментарии, на самом деле я разработчик приложений для Windows и новичок в веб-приложениях. Я лучше понимаю, о чем вы говорили.

Не могли бы Вы уточнить следующий запрос ,

Я поместил сетку (которая имеет флажок в качестве поля шаблона) внутри панели updatePanel, поэтому при запуске события AutoPostBack Page_Load() происходит ли повторная загрузка всей страницы?

2)После установки AutoPostBack в TRUE при щелчке флажка запускается событие CheckedChanged. После снятия флажка он не срабатывает.

Позже я установил Checked = True при загрузке страницы, теперь событие срабатывает, когда оно снято, а не когда проверено.

Могу я узнать причину такого поведения ?

F-ES Sitecore

С updatepanel событие загрузки страницы и т. д. все равно будет срабатывать, поскольку html для страницы все еще строится как обычно, единственная разница заключается в том, что вместо отправки всего html на страницу он работает над тем, что нужно обновить только для того, что находится в updatepanel, и управляет этим с помощью javascript.

Что касается другой проблемы, если вы вручную прикрепляете свойство autopostback=true в своем коде, то вы должны прикреплять это событие к каждому обратному сообщению, оно не будет "запоминаться" автоматически. Таким образом, возможно, вы устанавливаете его при загрузке страницы, но после autopostback вы не устанавливаете его снова, поэтому флажки больше не являются autopostback.

VinKot

После PostBack я устанавливаю событие в GridView_RowBound ().

Каждый раз при обратной передаче элементы управления шаблоном создаются сеткой, и она вызывает затем событие RowBound. Но не попадая в CheckedChanged ().

Скопировал мой исходный код выше для вашей справки.

F-ES Sitecore

Однако вызывается ли GridView_RowBound при обратной передаче? т. е. вы установили точку останова там в отладчике и подтвердили, что код выполняется, а не просто предполагаете, что это так?

VinKot

Да, это называется "постбэк". Я проверил это, поставив точку останова во время отладки.

Рейтинг:
0

AnvilRanger

У вас действительно есть несколько вариантов, и правильный зависит от того, что вы делаете в своем событии CheckedChanged.

1. Установите AutoPostBack в True, пусть страница завершит свою обратную передачу и обработает любую логику, которая должна быть выполнена.

2. Возможно посмотреть размещении сетки в UpdatePanel и. Затем вы можете выполнить Шаг 1, но обновится только содержимое панели, а не вся страница.

3. Глядя на стороне клиента, используя jQuery или JavaScript, чтобы контролировать изменения.