2016-05-24 8 views
1

文字列(前のページのリストボックスから塗りつぶしてSessionを渡します)の配列を取得してラベルに表示しようとしていますこれはどうですか配列ました:セッションに渡された渡された配列をLabelに書き込むことができません

Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles CheckOut.Click 
    Dim x = ListBox1.GetSelectedIndices.Count 
    Dim ListPNames(x) As String 
    Dim i As Integer 

    i = 0 
    For Each item As String In ListBox1.GetSelectedIndices 
     ListPNames(i) = (ListBox1.SelectedItem).ToString 
     i = i + 1 

    Next 


    Session("SlctdPhones") = ListPNames(x) 

    Response.Redirect("CheckOut.aspx") 


End Sub 

をそして、これは私がそれを表示しようとしている方法です:

Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load 


    Dim SlctdPhones() As String = CType(Session.Item("SlctdPhones"), Array) 
    Dim i As Integer 

    Label3.Text = "" 

    For i = 0 To SlctdPhones.Length - 1 

    Label3.Text += SlctdPhones(i).ToString() + Environment.NewLine 
    Next 


End Sub 

それは私にエラーを与えている:オブジェクト参照をINSTAに設定されていませんオブジェクトのnce。がSlctdPhones.Length - 1 Lineに達すると! 私はまた私の配列のコードが正しい、私はそれを修正することができますか分からないが(それに正しく保存されているすべてのものですか?)

+0

:[「オブジェクトのインスタンスに設定されていないオブジェクト参照が」どういう意味?](HTTP: //stackoverflow.com/questions/779091/what-does-object-reference-not-set-to-an-instance-of-an-object-mean) – Krease

+0

しかし、配列はすでに宣言されており、前のページ、なぜ私はまだエラーが発生していますか?それは私が理解していないものです – xTMx

+0

配列が正しいデータを持っている場合は、デバッガを介して自分自身を伝えることができない場合は、ここでの基本に戻る必要があります。 –

答えて

2

あなたはこのようForループ宣言:

For Each item In ... 

をしかし、その後、ループの本体でitem変数を使用することはありません。代わりに、同じSelectedItemプロパティを使用し続けます。あなたはこのように見えるようにその全体の方法を変更したい:

Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load 
    Dim SlctdPhones As List(Of String) = TryCast(Session.Item("SlctdPhones"), List(Of String)) 

    If SlctdPhones Is Nothing OrElse SlctdPhones.Length = 0 Then 
     'Something went wrong here! 
     Return 
    End If 

    Label3.Text = String.Join("<br/>", SlctdPhones.ToArray()) 
End Sub 

しかし、私は本当にあなたではなく、データコントロールを使用し見てみたい:その固定して

Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles CheckOut.Click 
    Dim PNames As New List(Of String)() 
    For Each index As Integer In ListBox1.GetSelectedIndices 
     PNames.Add(ListBox1.Items(index).Value) 
    Next 
    Session("SlctdPhones") = PNames 

    Response.Redirect("CheckOut.aspx") 
End Sub 

を、をPage_Loadはこれを行うことができますラベルに<br/>を詰めるよりも。ここでは、リストビューのマークアップです:

<asp:ListView ID="ListView1" runat="server"> 
    <LayoutTemplate> 
    <ul> 
     <asp:PlaceHolder ID="itemPlaceholder" runat="server" />  
    </ul>     
    </LayoutTemplate> 
    <ItemTemplate> 
    <li><%# Container.DataItem.ToString() %></li> 
    </ItemTemplate> 
    <EmptyDataTemplate> 
    <p>Nothing here.</p> 
    </EmptyDataTemplate> 
</asp:ListView> 

そして、Page_Loadのはさらに簡単です:おそらく関連

Protected Sub Page_Load(sender As Object, e As EventArgs) Handles Me.Load 
    ListView1.DataSource = Session.Item("SlctdPhones") 
    ListView1.DataBind() 
End Sub 
+0

両方を試してみました。 – xTMx

1

表示]ページで、代わりにラベル

Dim SlctdPhones() As String = CType(Session.Item("SlctdPhones"), Array) 
Dim result as String = string.Join("<br>", SlctdPhones) 'Instead of <br> try Environment.NewLine as well 
YourLitetal = result 

のリテラルを使用して希望この助けて!

+0

別のオプションは、最初のページ(配列ではなく)で区切られた(改行で)文字列を作成し、次のページに渡し、リテラルを使用して表示することです。 YourLiteral = Session( "DelimitedSelectedItem")。ToString() ありがとう! – Sami

関連する問題