2011-04-12 37 views
2

背景:我有一個winForm應用程序,基於表單中提供的用戶輸入在數據庫中註冊用戶,自動生成一個隨機密碼和用戶名,並通過電子郵件向用戶發送一個鏈接,以根據所選營銷公司提交申請。ASP.NET w/VB.NET - MultiSelect on ListBox或CheckBoxList w/AutoPostback啓用

問題: 我得到捆綁列表框來填充w/autopostback設置爲true,但捆綁列表框只要你點擊一個lbcarrier就填充,它不允許你選擇多個運營商。

對於如何允許多選與回發功能有關嗎?

這裏的界面截圖:上Default.aspx的 screenshot

代碼:

 <td class="style1"> 
      Carriers:</td> 
     <td bgcolor="#ffffff" class="style2"> 
      <asp:ListBox AutoPostback="true" ID="lbCarriers" runat="server" Height="86px" Width="250px"> 
      </asp:ListBox> 
       </td> 
      </tr> 

     <td class="style1"> 
      Bundles:</td> 
     <td bgcolor="#ffffff" class="style2"> 
      <asp:ListBox ID="bundles" runat="server" Height="86px" Width="250px"> 
      </asp:ListBox> 
       </td> 
      </tr> 

代碼上default.aspx.vb:

Protected Sub lbCarriers_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles lbCarriers.SelectedIndexChanged 

    Dim splt() As String 
    Dim ac1 As Array 
    bundles.Items.Clear() 
    Dim item As ListItem = lbCarriers.SelectedItem 
    splt = item.ToString().Split("|") 
    ac1 = proxy.GetContractingBundles("test", "test", Trim(splt(0))) 
    For Each Pitem In ac1 
     bundles.Items.Add(Trim(splt(2)) & " | " & Pitem.FormBundleName) 
    Next 
End Sub 

爲尋找謝謝!

+0

我不認爲有一個簡單的方法來做到這一點。控制器無法知道他們正在選擇項目。您可能會將'autopostback = false'並掛上自己的javascript代碼,以便在文本框失去焦點時進行回發。我認爲這對於用戶體驗來說並不理想。或者,您可以使用AJAX來填充下一個文本框,但這當然會增加很多開銷。最後,您可能可以讓您的文本框成爲包含您的下一個文本框的更新面板的觸發器。 – Prescott 2011-04-12 14:22:04

回答

2

根據定義,AutoPostBack property將自動導致用戶更改列表選擇時發生回發。

爲了使您需要開啓AutoPostBack關閉多個選擇,並啓用SelectionMode property

<asp:ListBox SelectionMode="Multiple" ID="lbCarriers" runat="server" 
    Height="86px" Width="250px"> 

注意AutoPostBackfalse默認情況下,所以我乾脆省略了。

用戶提交後,您可以使用與您在lbCarriers_SelectedIndexChanged事件中具有的邏輯類似的邏輯來處理選定的列表框項目。然後,您可以循環查看項目並檢查項目的Selected property或循環查看GetSelectedIndices method的結果,並按項目的索引進行參考。

如果這不是您想要的路線,而您希望它在沒有回傳的情況下進行處理,那麼您需要編寫一些JavaScript。

編輯:通過您選擇的項目的代碼將類似於下面的代碼,你可能會把它放在一個由提交的按鈕的事件處理程序調用的方法。

bundles.Items.Clear() 
For Each item As ListItem In lbCarriers.Items 
    If item.Selected Then 
     Dim splt() As String 
     Dim ac1 As Array 
     splt = item.ToString().Split("|") 
     ac1 = proxy.GetContractingBundles("test", "test", Trim(splt(0))) 
     For Each Pitem In ac1 
      bundles.Items.Add(Trim(splt(2)) & " | " & Pitem.FormBundleName) 
     Next 
    End If 
Next 
+0

感謝您的回覆!你可以請張貼一些啓用SelectionMode屬性的示例代碼嗎?我不清楚如何實現這一點。 – 2011-04-12 14:47:05

+0

@Brian我更新了我的帖子。您可以將其指定爲標記的一部分,而不是在後面的代碼中啓用它。 – 2011-04-12 14:54:29

+0

感謝您的更新。你會在Protected Sub lbCarriers_SelectedIndexChanged下添加什麼循環?請儘可能提供代碼。我已經有循環For Each Pitem In ac1 bundles.Items.Add(Trim(splt(2))&「|」&Pitem.FormBundleName) – 2011-04-12 15:42:59

1

最簡單的修復方法是關閉AutoPostBack,並按照建議更改SelectionMode。然後有一個按鈕,Get Bundles。在該點擊事件中,您可以添加代碼以基於Carrier列表框來檢索捆綁軟件。

+0

感謝您的迴應!你可以請張貼一些啓用SelectionMode屬性的示例代碼嗎? – 2011-04-12 14:48:24