2009-06-10 26 views
5

Tôi đang cố gắng sử dụng lambdas trong một số mã VB.Net, về cơ bản tôi đang cố gắng thiết lập một cờ khi databound được gọi.Đấu tranh với VB .net Lambdas

Giản nó trông như thế này:

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() 

sự hiểu biết của tôi là biến databoundCalled nên được thiết lập là true, rõ ràng tôi là thiếu một cái gì đó như biến luôn vẫn là sai.

Tôi cần phải làm gì để khắc phục sự cố?

+0

Tôi sẽ không ngạc nhiên nếu đơn giản hóa của bạn đã xóa sự cố. Bạn có thể đăng một chương trình ngắn nhưng * hoàn chỉnh * thể hiện sự cố không? –

+0

Mã tôi đã đăng không hiển thị sự cố. – ilivewithian

Trả lời

3

Độc dòng Lambdas trong vb.net LUÔN là những biểu hiện, những gì biểu thức lambda của bạn đang làm được về cơ bản nói không databoundCalled = Đúng hay (databoundCalled == True) nếu aC# anh chàng của bạn, không được thiết lập databoundCalled = True

+0

Rất hữu ích, cảm ơn (vâng tôi đến từ nền C#) – ilivewithian

+0

VB.Net Lambdas có thể đánh giá bất kỳ giá trị nào, không chỉ đúng hay sai. Thực hiện chức năng sau() 42 – JaredPar

+0

Bạn có quyền, trong trường hợp không có toán tử bằng –

7

Sau khi xem mã của bạn và gãi đầu, tôi đã tìm thấy giải pháp hoạt động. Bây giờ, tại sao điều này làm việc trên những gì bạn có, tôi không rõ ràng. Có lẽ điều này ít nhất sẽ giúp bạn đi đúng hướng. Sự khác biệt chính là tôi có một phương thức đặt giá trị thành true/false. Mọi thứ khác là như nhau.

Dưới đây là toàn bộ mã dự án web của tôi:

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 

Tôi hy vọng điều này sẽ giúp!

+0

Cảm ơn ví dụ, rất hữu ích. – ilivewithian

1

Vấn đề là làm thế nào lambdas được giải thích. Trong VS2008 một hàm lambda luôn được hiểu là một biểu thức chứ không phải là một câu lệnh. Lấy đoạn mã sau đây làm ví dụ

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

Trong trường hợp này, mã bên trong lambda del không thực hiện chuyển nhượng. Đó là thay vì làm một so sánh giữa biến x và giá trị 32. Lý do tại sao VB không có khái niệm về một biểu thức là một nhiệm vụ, chỉ một câu lệnh có thể là một phép gán trong VB.

Để thực hiện bài tập trong biểu thức lambda, bạn phải có khả năng tuyên bố. Điều này sẽ không có sẵn cho đến khi VS2010 nhưng khi đó là bạn có thể làm như sau

Dim del = Function() 
      x = 32 
      End Function 

Về cơ bản bất cứ điều gì không phải là một dòng lambda được hiểu là một tuyên bố.

Các vấn đề liên quan