我是vb.net的新手并试图在vb.net中构建一个win CE应用程序。手持设备的sdk是在C#中,我用在线转换器转换为vb.net。 下面是C#代码:
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代码中添加了一个'p'到属性的名称,因为我有一个错误说
条形码已在此类中声明为公共字符串
我不确定这是否是我问题的一部分,但我真正的问题是,在他们使用的表格上.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:
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 :(得分:0)
C#片段创建一个匿名方法,它调用该方法来执行UI线程上的操作,并发送e.Barcode
作为参数。您的VB.NET转换仅尝试调用DirectCast
的一些奇怪且不完整的使用。 VB.NET转换中不需要DirectCast
,因为您没有任何必须强制转换为委托方法的delegate
关键字。
您最简单的解决方案是使用Lambda方法:
Me.BeginInvoke(Sub() 'Lambda anonymous method.
scanCount = 0
Dim item As New ListViewItem(New String() {e.Barcode})
lstView.Items.Insert(0, item)
End Sub)
修改强>
由于在使用lambda表达式时出现错误,我假设您以.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