asp dropdownlist - на стороне сервера SelectedIndexChanged срабатывает только при использовании мыши, а не когда выбор устанавливается с помощью кода ... Кто-нибудь может помочь? - PullRequest
1 голос
/ 11 февраля 2011

Новое в публикации здесь, но я прочитал много других тем и нашел отличные ответы в прошлом! Я надеюсь, что кто-то знает, почему это может происходить ... В моем DDL серверное событие SelectedIndexChanged возникает только тогда, когда пользователь фактически нажимает на элемент управления и изменяет выбор ... но не когда я устанавливаю выбор с помощью кода JavaScript. Любая помощь приветствуется !!!

Вот код ...

<%@ Page Language="VB" AutoEventWireup="false" Inherits="FileUpload._Default" 
    EnableEventValidation="false" EnableViewState="true" 
    Codebehind="Default.aspx.vb" %> 
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit"
    TagPrefix="cc1" %>

Этот код OnChange на стороне клиента запускается независимо от того, изменен ли выбор с помощью графического интерфейса или меня в коде:

function ddDBF_OnChange(dropdown) 
{   
    UpdateSelectedMappings(); 
}

Когда я устанавливаю выбранное значение в js следующим образом, событие SelectedIndexChanged на стороне сервера не запускается:

dropdowns.item(i).options[k].selected = "selected";

Вот определение для элемента управления (его повторяется в виде сетки):

<asp:gridview id='gvMap' runat='server' autogeneratecolumns='False' 
onrowdatabound='gvMap_rowdatabound'>
<columns>
<asp:boundfield datafield='f1' headertext='h1' />
<asp:templatefield headertext='h2'>
<itemtemplate>
<asp:dropdownlist LastSel = '' ID='ddDBF' CssClass='ddDBF' runat='server' AutoPostBack='True' onchange='ddDBF_OnChange();'                   OnSelectedIndexChanged='ddDBF_SelectedIndexChanged' OnDataBound = 'ddDBF_OnDataBound'
OnClientPopulated='ddDBF_OnClientPopulated' EnableViewState = 'true' >
</asp:dropdownlist>
<cc1:CascadingDropDown id='cddDBF'
runat='server' 
Category='DataBaseField'
TargetControlID='ddDBF'
LoadingText='Loading Database Fields..'
ServicePath='CascadingDropDown.asmx'
ServiceMethod='GetDatabaseFields'
UseContextKey='true'
ContextKey='Set serverside gvMap_RowDataBound'
EnableViewState = 'true'
>
</cc1:CascadingDropDown>
</ItemTemplate>
</asp:templatefield>
</columns>
</asp:gridview>

... и не уверен, что это важно, но вот событие на стороне сервера:

Protected Sub ddDBF_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs)
    Dim d As DropDownList = sender
    d.Attributes("LastSel") = d.SelectedValue

    Dim hdnSelect As HiddenField = Page.FindControl("AlreadyMapped")
    Session("MappedFields") = hdnSelect.Value 
End Sub

Хотя я думаю, что отсутствие запуска сервера вызывает проблему, с которой я сталкиваюсь, но я так и не объяснил, что это за проблема! : P По сути, у меня есть сетка этих каскадных выпадающих списков - состояние представления поддерживается, а значения сохраняются в обратных передачах, когда пользователь взаимодействует с ними. Однако иногда мне нужно установить значения в js-коде на стороне клиента - в этих случаях значение действительно изменяется в полях визуально, но при следующем действии обратной передачи они сбрасываются: (

Большое спасибо !!!!

Ответы [ 2 ]

1 голос
/ 11 февраля 2011

Использовать doPostBack: http://www.codedigest.com/Articles/ASPNET/320_Doing_or_Raising_Postback_using_doPostBack()_function_from_Javascript_in_AspNet.aspx

<script type="text/javascript">
        function CallServer() {
            __doPostBack('lbDoPostBack', 'JavaScript');

        }
    </script>
0 голосов
/ 12 февраля 2011

Попробовал doPostBack безуспешно, но я нашел решение, поэтому решил поделиться.Это сбивало меня с толку, почему фактическое нажатие на список оставляло значения, но их установка программно приводила к потере значения после обновления каскадных выпадающих списков.

Оказывается, что с помощью элементов управления cdd ajax вы не можетепросто установите выбранное значение ddl - вы должны установить его в веб-методе, из которого загружается CDD.При добавлении .add к структуре List, вы добавляете третий параметр - true для выбранного, false для не выбранного.После внесения этих изменений все хорошо.

dbFieldNames.Add(new CascadingDropDownNameValue(row["FieldName"].ToString(), row["FieldName"].ToString(), True));
...