2009-06-10 123 views
5

我想在一些VB.Net代碼中使用lambdas,本質上我試圖在調用databound時設置一個標誌。掙扎與VB .net Lambdas

簡化它看起來像這樣:

Dim dropdownlist As New DropDownList() 
dropdownlist.DataSource = New String() {"one", "two"} 
Dim databoundCalled As Boolean = False 
AddHandler dropdownlist.DataBound, Function(o, e) (databoundCalled = True) 
dropdownlist.DataBind() 

我的理解是,databoundCalled變量應被設置爲true,顯然我失去了一些東西作爲變量始終保持假。

我需要做些什麼來解決它?

+0

如果您的簡化解決了問題,我不會感到驚訝。你可以發佈一個簡短但完整的*程序來證明問題嗎? – 2009-06-10 08:12:38

+0

我發佈的代碼確實顯示了問題。 – ilivewithian 2009-06-10 08:31:27

回答

3

單行lambda表達式在vb.net時時刻刻都表情,你的lambda表達式是做基本上是說確實databoundCalled = True或(databoundCalled ==真),如果你的C#的傢伙,沒有設置databoundCalled =真

7

查看您的代碼並摸索我的頭後,我發現了一個可行的解決方案。現在,爲什麼這對你有什麼影響,我不清楚。也許這至少會幫助你朝正確的方向發展。關鍵的區別是我有一個方法將值設置爲true/false。其他一切都是一樣的。

這裏是我的整個網絡項目代碼:

Partial Public Class _Default 
    Inherits System.Web.UI.Page 

    Dim databoundCalled As Boolean = False 
    Dim dropdownlist As New DropDownList() 

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     Response.Write(databoundCalled) 
     Bind() 
     Response.Write(databoundCalled) 

    End Sub 

    Sub Bind() 
     AddHandler dropdownlist.DataBound, Function(o, e) (SetValue(True)) 

     dropdownlist.DataSource = New String() {"one", "two"} 
     dropdownlist.DataBind() 
    End Sub 

    Function SetValue(ByVal value As Boolean) As Boolean 
     databoundCalled = value 
     Return value 
    End Function 
End Class 

我希望這有助於!

+0

感謝您的示例,非常有幫助。 – ilivewithian 2009-06-10 15:06:35

1

問題是如何解釋lambda表達式。在VS2008中,函數lambda總是被解釋爲表達式而不是語句。以下面的代碼塊爲例

Dim x = 42 
Dim del = Function() x = 32 
del() 

在這種情況下,lambda del內的代碼沒有執行任務。而是在變量x和值32之間進行比較。之所以VB沒有作爲賦值的表達式的概念,只有一個語句可以是VB中的賦值。

爲了在lambda表達式中進行賦值,您必須具有語句功能。這將無法使用,直到VS2010但是當它是你可以做以下

Dim del = Function() 
      x = 32 
      End Function 

本質東西是不是單行線拉姆達被解釋爲一個語句。