2011-04-12 7 views
2

배경 : 폼에 제공된 사용자 입력을 기반으로 데이터베이스에 사용자를 등록하고 임의로 자동 생성하는 winForm 응용 프로그램이 있습니다. 암호 및 사용자 이름을 입력하고 선택한 마케팅 회사를 기반으로 응용 프로그램을 가져올 링크를 전자 메일로 보냅니다.VB.NET을 사용하는 ASP.NET - ListBox의 MultiSelect 또는 AutoPostback이 활성화 된 CheckBoxList

문제 : autopostback이 true로 설정된 채울 수있는 목록 상자가 있지만 lb 케리어를 클릭하자마자 번들 목록 상자가 채워지고 둘 이상의 이동 통신사를 선택할 수 없습니다.

다시 게시 기능을 사용하여 다중 선택을 허용하는 방법에 대한 아이디어가 있습니까? default.aspx에에 screenshot

코드 : default.aspx.vb에

 <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> 

코드 :보고에 대한

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'를 넣고 자신의 자바 스크립트 코드를 연결하여 텍스트 박스가 포커스를 잃었을 때 포스트 백을 일으킬 수 있습니다. 나는 이것이 사용자 경험 관점에 이상적이라고 생각하지 않습니다. 또는 AJAX를 사용하여 다음 텍스트 상자를 채울 수도 있지만 당연히 많은 오버 헤드가 추가됩니다. 마지막으로, 텍스트 상자를 다음 텍스트 상자가 포함 된 업데이트 패널의 트리거로 사용할 수 있습니다. 귀하의 답변에 대해 – Prescott

답변

2

정의에 따라 AutoPostBack property은 사용자가 목록 선택을 변경하면 자동으로 다시 게시가 발생합니다.

AutoPostBack를 끄고해야합니다 복수 선택을 가능하게하고 SelectionMode property 사용하려면 : AutoPostBack은 기본적으로 false 그래서 난 간단하게 생략

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

하는 것으로.

사용자가 제출하면 lbCarriers_SelectedIndexChanged 이벤트에있는 것과 유사한 로직을 사용하여 선택한 목록 상자 항목을 처리 할 수 ​​있습니다. 그런 다음 항목을 반복하고 항목 Selected property을 확인하거나 GetSelectedIndices method의 결과를 반복하고 해당 색인을 기준으로 항목을 참조 할 수 있습니다.

이것이 원하는 경로가 아니며 다시 게시하지 않고 즉석에서 처리하려는 경우 일부 JavaScript를 작성해야합니다.

EDIT : 선택한 항목을 통과하는 코드는 아래 코드와 유사하므로 제출 된 단추의 이벤트 처리기에서 호출하는 메서드에 배치해야합니다.

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 속성을 활성화하는 몇 가지 예제 코드를 게시 할 수 있습니까? 이 방법을 구현하는 방법이 명확하지 않습니다. –

+0

@ Brian 내 게시물을 업데이트했습니다. 마크 업을 코드 뒤에 숨기지 않고 마크 업의 일부로 지정할 수 있습니다. –

+0

감사합니다. Protected Sub lbCarriers_SelectedIndexChanged 아래에 어떤 루프가 추가됩니까? 가능한 경우 코드를 제공하십시오. 나는 이미 각 Pitem For ac1에 대해 bundles.Items.Add (Trim (splt (2)) & "|"& Pitem.FormBundleName) –

1

가장 쉬운 수정 AutoPostBack을 끄고, 제안과 SelectionMode을 변경하는 것입니다. 그런 다음 버튼이 있습니다, Get Bundles. 해당 클릭 이벤트에서 코드를 추가하여 Carrier 목록 상자를 기반으로 번들을 검색 할 수 있습니다.

+0

! SelectionMode 속성을 활성화하는 몇 가지 예제 코드를 게시 할 수 있습니까? –