【问题标题】:Problems with AJAX CascadingDropDown and DropDownList SelectedValue in EditItemTemplateEditItemTemplate 中 AJAX CascadingDropDown 和 DropDownList SelectedValue 的问题
【发布时间】:2011-04-19 08:10:00
【问题描述】:

我在 FormView 的 EditItemTemplate 中遇到问题。

当我在 InsertItemTemplate 中使用此类代码时,一切正常:

<asp:DropDownList ID="Lic_PosiadaczLicencjiIDDropDownList" runat="server" 
    SelectedValue='<%# Bind("Lic_PosiadaczLicencjiID") %>' />
<asp:CascadingDropDown ID="CascadingDropDown1" runat="server" 
    TargetControlID="Lic_PosiadaczLicencjiIDDropDownList" Category="Knt_Kod" 
    ServicePath="~/ManagerLicencjiService.asmx" ServiceMethod="GetKontrahenci">
</asp:CascadingDropDown>  

但是当我在 EditItemTemplate 中使用完全相同的代码时,我收到一个错误,即 SelectedValue 错误,因为它不存在于元素列表中。 我认为问题在于 DropDownList 在 被服务填充之前检查了值。当我运行调试器时,错误发生在服务方法中的断点之前。

如何解决这个问题?

【问题讨论】:

    标签: c# asp.net cascadingdropdown selectedvalue edititemtemplate


    【解决方案1】:

    &lt;rant&gt;我发现 CCD 非常笨重,并且充满了文档不足的解决方法&lt;/rant&gt;,但这里是您如何做一些简单的事情,例如在填充 ddl 时选择一个值。请注意,所选值未在 DDL 上设置,而是被传递到完成选择的 Web 服务。

    <asp:ScriptManager ID="sm1" runat="server"></asp:ScriptManager>
    <asp:FormView ID="fv1" runat="server" DataSourceID="yourDataSource">
        <EditItemTemplate>
            <asp:DropDownList ID="Lic_PosiadaczLicencjiIDDropDownList" runat="server" />
            <asp:CascadingDropDown ID="CascadingDropDown1" runat="server" 
                TargetControlID="Lic_PosiadaczLicencjiIDDropDownList" Category="Knt_Kod" 
                ServicePath="~/ManagerLicencjiService.asmx" ServiceMethod="GetKontrahenci"
                UseContextKey="true" ContextKey='<%# Bind("Lic_PosiadaczLicencjiID") %>'>
            </asp:CascadingDropDown>
        </EditItemTemplate>
    </asp:FormView>
    
    <asp:sqldatasource id="yourDataSource"
        selectcommand="select Lic_PosiadaczLicencjiID FROM yourdatabase"
        UpdateCommand="Update yourdatabase set Lic_PosiadaczLicencjiID = @newvalue WHERE Lic_PosiadaczLicencjiID = @Lic_PosiadaczLicencjiID"
        connectionstring="<%$ ConnectionStrings:yourConnectionString %>" 
        runat="server" 
        onupdating="yourDataSource_Updating">
        <UpdateParameters>
            <asp:Parameter Name="newvalue" DbType="String" />
        </UpdateParameters>
    </asp:sqldatasource>
    

    后面的代码:

    protected void yourDataSource_Updating(object sender, SqlDataSourceCommandEventArgs e)
    {
        e.Command.Parameters["@newvalue"].Value = ((DropDownList)fv1.FindControl("Lic_PosiadaczLicencjiIDDropDownList")).SelectedValue;
    }
    

    在您从中获取数据的 Web 服务中,您需要将上下文键添加到签名中完全如图所示,因为它区分大小写。然后检查所选值的返回值并设置 selected = true。如果您想要选择的值而不是选择的文本,请检查 x.value 而不是 x.name。

    [WebMethod]
    public CascadingDropDownNameValue[] GetKontrahenci(string knownCategoryValues, string category, string contextKey)
    {
         CascadingDropDownNameValue[] results = getdata();
    
         CascadingDropDownNameValue selectedVal = (from x in results where x.name == contextKey select x).FirstOrDefault();
         if (selectedVal != null)
             selectedVal.isDefaultValue = true;
    
        return results;
    }
    

    希望这会有所帮助!

    【讨论】:

    • 我完全支持你的咆哮! ;-) 更不用说微软转向 jQuery。不幸的是,我无法将您的帖子标记为答案,因为这并不能解决主要问题,即 ASP 在 DDL 填充它们之前需要 DDL 中的项目(选定项目)通过服务方法。我已经找到了一个解决方案,但是一个丑陋的解决方案:在数据绑定之前,我在服务器端用一个已知项目填充 DDL。但是,您帮我解决了另一个问题:stackoverflow.com/questions/3838203/… +1 :)
    • 通过从 DDL 中删除“SelectedValue”标签,如上所示,aspx 页面不应要求“在通过服务方法填充 DDL 之前来自 DDL 的项目(选定项目)。”?
    • 我按照你说的做了,没有返回错误。我看到列表中的项目, contextKey 正在工作。但是,现在更新操作不起作用。不起作用我的意思是新选择的值没有传递到数据库。而是通过旧的,因此没有更新。
    • 您是否使用 onitemUpdating 更新数据库?当我测试我的应用程序时,我得到了新值。
    • 那我一定是做错了什么...我没有使用 ItemUpdating 事件。但是我在 EditItemTemplate 中同时使用了控件 DDL 和 CDD。它在 EditItemTemplate 中对你有用吗?
    猜你喜欢
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    相关资源
    最近更新 更多