2010-09-17 19 views
1

嘿,所有,我在ViewState是新的,我期待看看它裏面存儲了什麼值。我知道如何遍歷一個數組來檢查一個值,但我不知道如何去做ViewState(「test」)屬性。檢查在ViewState中的值

假設我已將「bob,tom,Jim」添加到名爲ViewState(「test」)的ViewState中。我希望能夠看到「湯姆」是否在ViewState(「測試」)。如果沒有,則添加它,但如果它已經存在,則跳過它。

謝謝!

大衛

守則

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 

我很困惑..哈哈。

+0

您可以發佈一些代碼嗎?你是如何添加名字的?作爲一個字符串數組?一個字符串?我們不知道如何回答這個問題。 – 2010-09-17 18:20:47

+0

我已經添加了上面的代碼,KP。 – StealthRT 2010-09-17 19:07:39

回答

8

假設你把值作爲一個字符串:

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

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

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

End If 

如果你使用一個字符串來存儲名字以上會工作。您可能需要考慮一個集合對象,如List。

然後,您可以有:

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 

在一個側面說明,我討厭VB.NET。你應該考慮C#。如下簡單得多:

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

我已經在上面的OP中添加了我的代碼但我有點困惑如何保存它(以及在哪裏)以及如何檢索它在循環類型的東西.. – StealthRT 2010-09-17 19:08:18

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

我已經在上面的OP中添加了我的代碼,但是我對如何保存它(以及在哪裏)以及如何在循環類型的事物中檢索它有點困惑。 – StealthRT 2010-09-17 19:09:26

2

通常,您會首先測試ViewState項目是否存在。

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

如果是這樣,下一步是檢索存儲在指定鍵上的對象。由於它是作爲一個對象存儲的,我們需要將其轉換爲代碼中真正的類型。

if (ViewState["Foo"] != null) 
{ 
    List<string> values = (List<string>)ViewState["Foo"]; 
    // do something with values 
} 

在這一點上,執行我們的列表中的特定值存在的測試是一個普通代碼的問題。

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

在VB中,這可能會是這樣的

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

我已經在我的OP上面添加了我的代碼,但我有點困惑如何保存它(以及在哪裏)以及如何在循環類型的東西中檢索它.. – StealthRT 2010-09-17 19:09:05

3

您可以通過只詢問了重點檢查已知的ViewState的鑰匙;如果「測試」尚未在ViewState中設置下也不會拋出異常:

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

ViewState中,作爲一個StateBag的,也是一個IEnumerable,這意味着你可以使用的foreach通過其內容重複,或者使用Linq按值搜索:

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

最後,ViewState將其鍵和值的集合公開爲ICollections。這些也可以重複,因爲ICollection是IEnumerable,這意味着您可以使用Linq檢查密鑰的存在:

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

我認爲OP有興趣使用鍵「test」檢查viewstate對象內的值,而不僅僅是鍵/項存在。 – 2010-09-17 18:54:17