2010-09-17 9 views
1

Salut à tous, je suis nouveau à l'ViewState et je cherche à voir quelles valeurs sont stockées en son sein. Je sais comment faire une boucle dans un tableau pour vérifier une valeur mais je ne sais pas comment procéder pour une propriété ViewState ("test"). Disons que j'ai ajouté "bob, tom, Jim" à un ViewState appelé ViewState ("test"). Je voudrais être en mesure de voir si "tom" était dans le ViewState ("test"). Si ce n'est pas le cas, ajoutez-le, mais s'il existe déjà, ignorez-le.Vérifiez pour une valeur dans ViewState

Merci!

David

CODE

Public strIDArray() As String 
Public vsSaver As String 

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     If Not Page.IsPostBack Then 
      ViewState("vsSaver") = "0000770000" 
     Else 
      If (Not ViewState("vsSaver") Is Nothing) Then 
       strIDArray(strIDArray.Length) = CType(ViewState("vsSaver"), String) 
      End If 
     End If 
end sub 

Private Sub gvData_RowCommand(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewCommandEventArgs) Handles gvData.RowCommand 
     Dim idIndexNumber As Integer = Array.IndexOf(strIDArray, strID) 

      If Not ViewState("strIDArray").ToString().Contains(strID) Then 
       strIDArray(idIndexNumber + 1) = strID 
       ViewState("strIDArray") = CLng(ViewState("strIDArray").ToString()) And CLng(strID) 
      End If 
End Sub 

Je suis tellement confus .. ha.

+0

Pouvez-vous poster du code? Comment avez-vous ajouté les noms? En tant que tableau de chaînes? Une seule chaîne? Nous ne pouvons pas vraiment répondre à cette question sans le savoir. –

+0

J'ai ajouté le code ci-dessus, KP. – StealthRT

Répondre

8

En supposant que vous mettez les valeurs dans une seule chaîne:

ViewState("test") = "bob, tom, jack" 

If Not ViewState("test").ToString().Contains("tom") Then 

    ViewState("test") = ViewState("test").ToString() And ", tom" 

End If 

Ce qui précède travailler si vous utilisez une seule chaîne pour stocker les noms. Vous pouvez envisager un objet de collection tel que Liste.

Vous pouvez alors:

Dim names As New List(Of String)() From { _ 
    "tom", _ 
    "jack", _ 
    "harry" _ 
} 

ViewState("test") = names 

Dim viewstateNames As List(Of String) = TryCast(ViewState("test"), List(Of String)) 

If viewstateNames IsNot Nothing AndAlso Not viewstateNames.Contains("tom") Then 
    viewstateNames.Add("tom") 
End If 

Sur une note côté, je déteste VB.NET. Vous devriez considérer C#. Beaucoup plus simple à suivre:

List<string> names = new List<string> { "tom", "jack", "harry" }; 
ViewState["test"] = names; 

List<string> viewstateNames = ViewState["test"] as List<string>; 
if (viewstateNames != null && !viewstateNames.Contains("tom")) 
{ 
    viewstateNames.Add("tom"); 
} 
+0

J'ai ajouté mon code dans mon OP ci-dessus mais je suis un peu confus sur la façon de le sauver (et où) et comment le récupérer dans un type de boucle de chose .. – StealthRT

0
Dim testValue As String = CStr(ViewState("test")) 

If testValue.IndexOf("tom") = -1 Then 
'add it.... 
testValue += testValue & ", tom" 'will add to end of string 
ViewState("test") = testValue 
End If 
+0

J'ai ajouté mon code dans mon OP ci-dessus mais je suis un peu confus sur la façon de le sauvegarder (et où) et comment le récupérer dans un type de chose en boucle .. – StealthRT

2

En règle générale, vous devez d'abord tester que l'élément ViewState existe.

if (ViewState["Foo"] != null) 
{ 
    // maybe I can do something here 
} 

Si c'est le cas, l'étape suivante consiste à récupérer l'objet stocké avec la clé spécifiée. Comme il est stocké en tant qu'objet, nous devrions convertir ce que le type est réellement dans notre code. À ce stade, effectuer notre test de l'existence d'une valeur particulière dans notre liste est une question de code normal.

if (ViewState["Foo"] != null) 
{ 
    List<string> values = (List<string>)ViewState["Foo"]; 
    if (!values.Contains("tom")) 
    { 
     values.Add("tom"); 
    } 
} 

En VB, ce serait sans doute quelque chose d'un peu d'interroger la clé comme

If Not (ViewState("Foo") Is Nothing) Then 
    List(of String) values = CType(ViewState("Foo"), List(of String)) 
    If Not (values.Contains("tom")) Then 
     values.Add("tom") 
    End If 
End If 
+0

J'ai ajouté mon code dans mon OP ci-dessus, mais je suis un peu confus sur la façon de le sauver (et où) et comment le récupérer dans un type de chose en boucle .. – StealthRT

3

Vous pouvez vérifier les clés connues de ViewState; ce qui suit ne lancera pas d'exception si « test » n'a pas été défini dans ViewState:

if(ViewState["test"] == null) ... 

ViewState, étant un StateBag, est aussi un IEnumerable, ce qui signifie que vous pouvez parcourir son contenu en utilisant foreach, ou utiliser LINQ pour rechercher par valeur:

ViewState.Where(si=>si.IsDirty); //gets all ViewState members that changed since the last postback 

Enfin, ViewState expose les collections de ses clés et des valeurs comme ICollections.Ceux-ci peuvent également être itérés comme ICollection est un IEnumerable, ce qui signifie que vous pouvez utiliser Linq pour vérifier l'existence d'une clé:

if(ViewState.Keys.Any(k=>k == "test")) ... 
+0

Je pense que l'OP était intéressé par la vérification d'une valeur dans l'objet viewstate avec la clé 'test', et pas seulement que la clé/élément existe. –

Questions connexes