1

在这里发帖的新手,但我已经阅读了很多其他线程并在过去找到了很好的答案!我希望有人知道为什么会发生这种情况...在我的 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" %>

无论选择是通过 gui 还是由我自己在代码中更改,此客户端 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 代码中设置值 - 在这些情况下,值在框中确实会在视觉上发生变化,但在下一个回发操作中它们会被重置:(

非常感谢!!!!

4

2 回答 2

1

使用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>
于 2011-02-10T21:12:52.887 回答
0

尝试 doPostBack 没有成功,但我确实找到了解决方案,所以我想我会分享。我感到困惑的是,为什么实际上单击列表框会保留值,但以编程方式设置它会导致在级联下拉菜单刷新后值丢失。

事实证明,使用 cdd ajax 控件,您不能只设置 ddl 选定值 - 您必须将其设置为 cdd 从中加载的 webmethod。在对 List 结构执行 .add 时,附加第三个参数 - true 表示选中,false 表示未选中。做出改变后一切都很好。

dbFieldNames.Add(new CascadingDropDownNameValue(row["FieldName"].ToString(), row["FieldName"].ToString(), True));
于 2011-02-12T04:58:13.303 回答