2

質問:ポストバック後に両方のドロップダウンのコンテンツ (クエリから) と選択された値の両方を維持するにはどうすればよいですか?

ソース コード:このリンクからソース コードをダウンロードします(リンクが機能するようになりました)。AjaxControlToolkit への参照を追加するだけです

User Action:各ドロップダウンから値を選択してください。[送信] をクリックします。
ポストバック後: StatesDrop : (選択した値)、CitiesDrop「都市を選択」

前後:

代替テキスト http://www.aphio.org.vt.edu/test/beforeandafter.GIF

最初のドロップダウンが選択された値を取得すると、2 番目のドロップダウンが更新され、選択された値が失われると思います。

C# の回答も歓迎します。

デフォルト.aspx

Active States<br /><asp:DropDownList ID="StatesDrop" runat="server" /><br />
Active Cities<br /><asp:DropDownList ID="CitiesDrop" runat="server" /><br />

<ajax:CascadingDropDown ID="StatesCasc" TargetControlID="StatesDrop"
        ServicePath="WebService1.asmx" ServiceMethod="GetActiveStates"
        Category="States" runat="server"
        PromptText="Select a State" PromptValue="?"  />

<ajax:CascadingDropDown ID="CitiesCasc" TargetControlID="CitiesDrop"
        ServicePath="WebService1.asmx" ServiceMethod="GetActiveCities"
        Category="Cities" runat="server" ParentControlID="StatesDrop"
        PromptText="Select a City"  PromptValue="?"  />

WebService1.asmx.vb

Imports System.Web.Services
Imports System.Web.Services.Protocols
Imports System.ComponentModel
Imports System.Web.Script.Services
Imports AjaxControlToolkit
<System.Web.Script.Services.ScriptService()> _
<System.Web.Services.WebService(Namespace:="http://tempuri.org/")> _
<System.Web.Services.WebServiceBinding _
    (ConformsTo:=WsiProfiles.BasicProfile1_1)> _
<ToolboxItem(False)> _
Public Class WebService1: Inherits System.Web.Services.WebService

   <WebMethod()> _
   Public Function GetActiveStates (ByVal knownCategoryValues As String, _
        ByVal category As String) As CascadingDropDownNameValue()
        Dim values As New List(Of CascadingDropDownNameValue)()
        'Fill values array'
        Return values.ToArray()
    End Function

    <WebMethod()> _
    Public Function GetActiveCities (ByVal knownCategoryValues As String, _
        ByVal category As String) As CascadingDropDownNameValue()
        Dim values As New List(Of CascadingDropDownNameValue)()
        Dim kv As StringDictionary = _
         CascadingDropDown.ParseKnownCategoryValuesString(knownCategoryValues)
        Dim SelState As String = ""
        If kv.ContainsKey("State") Then SelState = kv("State")
        'Fill values array'
        Return values.ToArray()
    End Function
End Class

Default.aspx.vb

Imports System.Web.Services
Imports System.Web.Script.Services
Imports AjaxControlToolkit

Partial Public Class _Default
    Inherits System.Web.UI.Page

    Protected Sub Submit_Click(ByVal sender As Object, _
                               ByVal e As EventArgs) Handles SubmitBtn.Click
        ResultsGrid.DataBind()
    End Sub
End Class
4

3 に答える 3

1

依存ドロップダウンリストの項目はクライアント側に入力されるため。サーバーはそれを認識していません。各ポストバックに依存ドロップダウンリストのアイテムを入力する必要があります。したがって、page_loadに次のコードを記述します。

if(!IsPostBack) {
 //Some logic
}
else {
    //populate child drop down list on the base of selected value of parent drop down. 
// you can set the selected value of child control by getting the selected value from Request //object for example write following code to set the value of child control

childControl.SelectedValue = Request[childControl.UniqueID];
}

これがお役に立てば幸いです。

于 2010-05-20T11:18:31.850 に答える
0

ポストバックのドロップダウンリストの内容を維持するには、コードビハインドのコントロールをロードするロジックが、ポストバックかどうかを確認するifステートメントに含まれていることを確認してください。例えば...

protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            //Load Controls
        }
    }

コントロールからのデータの保持は、ビューステートによって行われます。

于 2010-05-12T13:29:53.007 に答える
0

CascadingDropDown を廃棄し、代わりに通常のポストバックと UpdatePanel を使用しました。

于 2010-05-21T13:54:45.700 に答える