2009-06-10 15 views
5

私はいくつかのVB.Netコードでlambdasを使用しようとしています。本質的に、databoundが呼び出されたときにフラグを設定しようとしています。VBで苦労しています。Lambda

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変数は、変数は常にfalseのままとして明らかに、私は何かが欠けてる、trueに設定しなければならないということである。

が、それはこのようになります簡体。

修正するために何をする必要がありますか?

+0

あなたの簡素化によって問題が取り除かれても驚くことはありません。問題を示す短くて完全な*プログラムを投稿できますか? –

+0

私が掲示したコードは問題を示しています。 – ilivewithian

答えて

3

シングルラインラムダは常に式で、どのようなあなたのラムダ式は基本的に言ってやっていることはdataboundCalled = Trueまたは(databoundCalled == true)をお使いのAC#の男が、設定されていない場合databoundCalled = Trueの

+0

非常に役に立ちました、ありがとう(はい、私はC#の背景です) – ilivewithian

+0

VB.Net Lambdasは、真または偽ではなく、任意の値に評価することができます。次のFunction()を取る42 – JaredPar

+0

あなたが正しい場合、等号演算子がない場合 –

7

あなたのコードを見て頭を傷つけた後、私はうまくいくソリューションを見つけました。さて、なぜこれがあなたが持っているものよりもうまくいくか、私ははっきりしない。たぶん、これは少なくともあなたが正しい方向にあなたを助けるでしょう。主な違いは、値をtrue/falseに設定するメソッドがあることです。他のすべては同じです。ここで

は私の全体のWebプロジェクトのコードです:

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 

私はこれが役に立てば幸い! vb.netで

+0

例のおかげで非常に役に立ちました。 – ilivewithian

1

を行います問題はラムダの解釈方法です。 VS2008では、関数lambdaは常に式として解釈され、ステートメントではありません。例えばこの場合

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

として、次のコードブロックを取り、ラムダデル内のコードは、割り当てを行っていません。代わりに、変数xと値32との比較を行います。なぜなら、VBには代入式の概念がないため、VBでの代入だけが代入式になる可能性があるからです。

ラムダ式で代入を行うには、ステートメント機能が必要です。これは、VS2010までは利用できませんが、それはあるとき、あなたは、単一の行のラムダが文として解釈されないが、以下の

Dim del = Function() 
      x = 32 
      End Function 

基本的に何もすることができます。