2

我在FormView的EditItemTemplate中遇到問題。在EditItemTemplate中AJAX CascadingDropDown和DropDownList SelectedValue的問題

當我使用InsertTemplate則一切這樣的代碼工作:

<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檢查之前它是由服務填充。當我運行調試器時,錯誤發生在服務方法中的斷點之前。

如何解決這個問題?

+0

asp!= asp.net :) – JumpingJezza 2010-10-05 00:27:30

回答

1

<rant>我發現CCD非常笨重,並且有很多文檔不完整的解決方法</rant>,但是您可以在填充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; 
} 

希望這有助於!

+0

我完全支持你的咆哮! ;-)更不用說微軟轉向jQuery了。不幸的是,我不能將你的帖子標記爲答案,因爲這並不能解決主要問題,即在DDL填充DDL之前,ASP需要DDL項目(選定項目)由服務方法。我發現了一個解決方案,但很醜陋:我在數據綁定之前在服務器端填充了一個已知項的DDL。但是,你已經幫助我解決了另一個問題:http://stackoverflow.com/questions/3838203/how-to-pass-an-additional-parameter-to-cascadingdropdown-servicemethod/3839134#3839134 +1 :) – Wodzu 2010-10-04 11:15:25

+0

By從DDL中刪除「SelectedValue」標籤,如上圖所示,aspx頁面不應該要求「在DDL由服務方法填充它們之前,DDL中的項目(所選項目)」。 – JumpingJezza 2010-10-05 00:26:00

+0

我照你說的做了,它不會返回錯誤。我看到列表中的項目,contextKey正在工作。但是,現在更新操作不起作用。通過不起作用,我的意思是新選定的值不傳遞給數據庫。相反,舊的通過,所以沒有更新。 – Wodzu 2010-10-05 07:22:05

相關問題