2011-07-29 16 views
3

私は、UpdatePanel内にドロップダウンリスト、2つのボタン、2つのリストボックスを持つフォームを持っています。ドロップダウンリストとリストボックスはすべてSqlDatasourcesにバインドされています。ASP.NET 4 - UpdatePanelはリストボックスを更新しません

ドロップダウンリストでは、あなたの部門を選択できます。

最初のリストボックスには、部門から選択したジョブのリストが表示されます。

2番目のリストボックスには、これらの項目の逆のリストが表示されます。

1番目のリストボックスから項目が削除されると、2番目のリストボックスに表示されます。
2番目のリストボックスから項目が削除されると、それは、この機能を使用すると、追加と削除ボタンなどのページ機能であなたの部署

ザ・から2つのボタンが仕事をしている追加および削除することができます

...第一リストボックスに表示されるはずです。リストボックスが確実に更新されないことを除いて、すべてが機能しています。データ自体はデータベースで更新され、リフレッシュ(F5)すると正しく表示されます。

<asp:ScriptManager ID="smgrDeptsJobs" runat="server"></asp:ScriptManager> 
<asp:UpdatePanel ID="uPanelDeptsJobs" runat="server"> 
    <ContentTemplate> 
     <asp:DropDownList ID="ddlDepartments" runat="server" 
      DataSourceID="sqldsDepartments" DataTextField="Department" 
      DataValueField="DeptID" Width="150px" AutoPostBack="True"> 
     </asp:DropDownList> 

     <asp:ListBox ID="lstJobsIn" runat="server" DataSourceID="sqldsJobsIn" 
      DataTextField="JobName" DataValueField="JobID" height="156px" 
      width="220px"> 
     </asp:ListBox> 

     <asp:Button ID="btnAddJob" runat="server" Text="&lt;&lt;" Width="70px" 
      CausesValidation="False" /> 

     <asp:Button ID="btnRemoveJob" runat="server" Text="&gt;&gt;" Width="70px" 
      CausesValidation="False" /> 

     <asp:ListBox ID="lstJobsOut" runat="server" DataSourceID="sqldsJobsOut" 
      DataTextField="JobName" DataValueField="JobID" height="156px" 
      width="220px"> 
     </asp:ListBox> 
    </ContentTemplate> 
    <Triggers> 
     <asp:AsyncPostBackTrigger ControlID="ddlDepartments" 
      EventName="SelectedIndexChanged" /> 
     <asp:AsyncPostBackTrigger ControlID="btnAddJob" EventName="Click" /> 
     <asp:AsyncPostBackTrigger ControlID="btnRemoveJob" EventName="Click" /> 
    </Triggers> 
</asp:UpdatePanel> 

2つのボタンのクリックイベントのコードは以下の通りです:

Protected Sub btnAddJob_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAddJob.Click 

    Dim sqlJobsDB As New SqlConnection(ConfigurationManager.ConnectionStrings("JobsDB").ConnectionString) 
    Dim sqlCmdInsert As SqlCommand = sqlJobsDB.CreateCommand() 

    sqlJobsDB.Open() 
    sqlCmdInsert.CommandText = _ 
     "INSERT INTO tblDeptsJobs (DeptID, JobID) VALUES " + _ 
     "(@DeptID, @JobID)" 

    ' Declare the data types for the parameters 
    sqlCmdInsert.Parameters.Add("@DeptID", SqlDbType.TinyInt) 
    sqlCmdInsert.Parameters.Add("@JobID", SqlDbType.TinyInt) 

    ' Assign the parameters values from the form 
    sqlCmdInsert.Parameters("@DeptID").Value = ddlDepartments.SelectedValue 
    sqlCmdInsert.Parameters("@JobID").Value = lstJobsOut.SelectedValue 

    ' Execute the insert Statement 
    sqlCmdInsert.ExecuteNonQuery() 

    sqlJobsDB.Close() 

End Sub 

Protected Sub btnRemoveJob_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnRemoveJob.Click 

    Dim sqlJobsDB As New SqlConnection(ConfigurationManager.ConnectionStrings("JobsDB").ConnectionString) 
    Dim sqlCmdDelete As SqlCommand = sqlJobsDB.CreateCommand() 

    sqlJobsDB.Open() 
    sqlCmdDelete.CommandText = _ 
     "DELETE FROM tblDeptsJobs WHERE tblDeptsJobs.DeptID = @DeptID AND tblDeptsJobs.JobID = @JobID" 

    ' Declare the data types for the parameters 
    sqlCmdDelete.Parameters.Add("@DeptID", SqlDbType.TinyInt) 
    sqlCmdDelete.Parameters.Add("@JobID", SqlDbType.TinyInt) 

    ' Assign the parameters values from the form 
    sqlCmdDelete.Parameters("@DeptID").Value = ddlDepartments.SelectedValue 
    sqlCmdDelete.Parameters("@JobID").Value = lstJobsIn.SelectedValue 

    ' Execute the insert Statement 
    sqlCmdDelete.ExecuteNonQuery() 

    sqlJobsDB.Close() 

End Sub 

私が追加またはジョブを削除すると、私は最後の項目を選択し、リストボックスには、1つであるようにそれは感じています更新されません。

また、ドロップダウンリストの自動ポストバックをTrueに設定せずにリストボックスを更新するためのドロップダウンリストを取得できません。

更新:私が思いついた醜いバンドの修正は、listbox.items.clear()メソッドを使用して、各リストボックスのデータを再バインドすることです。

+0

非同期ポストバックのサーバーサイドコードを追加できますか? – Becuzz

+0

あなたがUpdatePanelと結婚していないなら、私はjavascript/jQueryとウェブメソッドを使ってやってみることをお勧めします。 私はいつもASPアップデートパネルで頭痛がありました。 – Dan

+0

@Becuzz非同期ポストバック用のサーバーサイドハンドラは、私の理解からScriptManagerです。 Lucretius

答えて

1

基本的には、データベースを更新してもコントロールを再バインドしないということが起こります。私はあなたが(私は前にSQLデータソースコントロールを使用したことがないので)、この作品を作るためにあなたのクリックハンドラに配置する必要があります正確に何か分からないが、それはこのようなものになります。

Protected Sub btnAddJob_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnAddJob.Click 

    Dim sqlJobsDB As New SqlConnection(ConfigurationManager.ConnectionStrings("JobsDB").ConnectionString) 
    Dim sqlCmdInsert As SqlCommand = sqlJobsDB.CreateCommand() 

    sqlJobsDB.Open() 
    sqlCmdInsert.CommandText = _ 
     "INSERT INTO tblDeptsJobs (DeptID, JobID) VALUES " + _ 
     "(@DeptID, @JobID)" 

    ' Declare the data types for the parameters 
    sqlCmdInsert.Parameters.Add("@DeptID", SqlDbType.TinyInt) 
    sqlCmdInsert.Parameters.Add("@JobID", SqlDbType.TinyInt) 

    ' Assign the parameters values from the form 
    sqlCmdInsert.Parameters("@DeptID").Value = ddlDepartments.SelectedValue 
    sqlCmdInsert.Parameters("@JobID").Value = lstJobsOut.SelectedValue 

    ' Execute the insert Statement 
    sqlCmdInsert.ExecuteNonQuery() 

    sqlJobsDB.Close() 

    //may need to do explicit call to DB to get data here 
    //after you have the data, rebind 
    lstJobsIn.DataBind(); 
    lstJobsOut.DataBind(); 
End Sub 

おおよそですそれはどのように見えるでしょう。私は、あなたがあなたの問題を解決するために正確に何をするのかを見ることに興味があります。

+0

これは私がやったことです(私の最初の記事を編集しました)。それが必要かどうかわかりませんが、 '.DataBind()'の前にリストボックスの '.clear()'を実行していて、正しく動作しています。リストボックスは、 "databound itemsを修正する"プロパティがtrueに設定されている場合にのみ、おそらく '.clear()'が必要です。 – Lucretius

1

dropdownlist autopostbackをtrueに設定し、すべてのトリガーを削除し、updatepanelでChildrenAsTriggers = "true"に設定します。

+0

スクリーンショットでは、部門のドロップダウンリストから「メンテナンス」を選択しました。私は "Mixer"ジョブを右のリストボックスから左のリストボックスに移動しようとしました。左に表示されますが、右側のリストボックスからは削除されません。 http://i53.tinypic.com/35i4srb.pngページを手動で更新すると(F5)、右側のリストから削除されます。 – Lucretius

+0

DataSourceコントロールを同じUpdatePanelに入れることはできますか? –

+0

それを試して、動作しませんでした。データそのものはデータベース内で変更されているため、それらを更新してもリストボックスの更新には役立ちません。 – Lucretius

関連する問題