2016-07-08 2 views
0

Я новичок в vb.net и пытаюсь создать приложение win CE в vb.net. Sdk портативного устройства находится в C#, который я конвертировал с онлайн-конвертером в vb.net. Ниже C# код:Использование делегатов в vb.net

public class DecodeEventArgs : EventArgs 
{ 
    private string barcode; 
    private byte type; 

    public DecodeEventArgs(string barcodeData, byte typeData) 
    { 
     barcode = barcodeData; 
     type = typeData; 
    } 

    public string Barcode 
    { 
     get { return barcode; } 
     set { barcode = value; } 
    } 

    public byte Type 
    { 
     get { return type; } 
     set { type = value; } 
    } 

} 

переустроенные в vb.net, как:

Public Class DecodeEventArgs 
    Inherits EventArgs 
    Public barcode As String 
    Public type As Byte 

    Public Sub New(ByVal barcodeData As String, ByVal typeData As Byte) 
     barcode = barcodeData 
     type = typeData 
    End Sub 

    Public Property pBarcode() As String 
     Get 
      Return barcode 
     End Get 
     Set(ByVal value As String) 
      barcode = value 
     End Set 
    End Property 

    Public Property pType() As Byte 
     Get 
      Return type 
     End Get 
     Set(ByVal value As Byte) 
      type = value 
     End Set 
    End Property 
End Class 

В моем переходе от C# Я добавил «р» к имени свойства, как вы видите в моем vb.net код, потому что у меня была ошибка, что сказал

Barcode уже объявлен в качестве публичной строки в этом классе

Я не уверен, если это является частью моей проблемы, но моя реальная проблема, по форме они использовали .BeginInvoke, чтобы вызвать класс с этим кодом:

void scanner_DecodeEvent(object sender, DecodeEventArgs e) 
    { 
     Win32.sndPlaySound(Properties.Resources.Scan, Win32.SND_ASYNC | Win32.SND_MEMORY); 

     this.BeginInvoke((Action<string>)delegate(string barcode) 
     { 
      scanCount = 0; 
      ListViewItem item = new ListViewItem(new string[] { barcode }); 
      lstView.Items.Insert(0, item); 

     }, e.Barcode); 
    } 

который я преобразуется в vb.net as:

Private Sub scanner_DecodeEvent(ByVal sender As Object, ByVal e As DecodeEventArgs) 
    PlaySound() 

    Me.BeginInvoke(DirectCast(Barcode As String)) 
    scanCount = 0 
    Dim item As New ListViewItem(New String() {barcode}) 

    lstView.Items.Insert(0, item) 


End Sub 

Который дает мне ошибку о том, что штрих-код не объявляется. Здесь я застрял. Спасибо за вашу помощь заранее

ответ

0

Этот фрагмент C# создает анонимный метод, который он вызывает для выполнения действий в потоке пользовательского интерфейса, и он отправляет e.Barcode в качестве параметра. Преобразование VB.NET только пытается вызвать некоторые странные и неполные, использование DirectCast. DirectCast не требуется в преобразовании VB.NET, поскольку у вас нет ключевого слова delegate, которое вы должны применить к методу делегата.

Ваше самое простое решение было бы использовать метод лямбда:

Me.BeginInvoke(Sub() 'Lambda anonymous method. 
    scanCount = 0 
    Dim item As New ListViewItem(New String() {e.Barcode}) 
    lstView.Items.Insert(0, item) 
End Sub) 

EDIT:

Поскольку вы получаете ошибки при использовании лямбда-выражения, я предполагаю, что вы предназначаться .NET Framework 3,5 или ниже. В этом отношении он становится немного более сложным, как вы теперь должны поставить код в другом методе:

Private Sub AddBarcode(ByVal Barcode As String) 
    scanCount = 0 
    Dim item As New ListViewItem(New String() {Barcode}) 
    lstView.Items.Insert(0, item) 
End Sub 

Тогда вы должны объявить свой собственный метод делегата, который вы можете использовать для выполнения вызова:

Delegate Sub AddBarcodeDelegate(ByVal Barcode As String) 

Private Sub scanner_DecodeEvent(ByVal sender As Object, ByVal e As DecodeEventArgs) 
    Me.BeginInvoke(New AddBarcodeDelegate(AddressOf AddBarcode), e.Barcode) 
End Sub 
+0

Спасибо @Visual Vincent. Выглядит намного чище, но подчеркивает Sub(), говоря «Expression Expected». Я также вынул «) после« End Sub », потому что это было подчеркнуто. –

+0

@PercyKumah: Какую версию .NET Framework вы настраиваете? Кроме того, вам не нужно «@» кого-то на своем собственном посту. :) –

+0

Скобка после 'End Sub' должна быть там, так как она закрывает' Me.BeginInvoke'. –

Смежные вопросы