将子控件项值发送到父窗体文本框
Sending Child Control Item Value to Parent Form Textbox
今天我已经在这上面待了很长时间了。最近我们将 VB.NET 项目完全转换为 C#,它在各个方面都完美运行。
然而,我们遇到的问题是,我们的 ListControlItem 点击侦听器 在转换后是错误的。
我们有一个名为 flpListBox 的 FlowLayoutPanel,项目是在 Form1_Load.
中使用 Add() 方法添加的
例如
ListControl1.Add("name", "name2", "name3");
预期结果
当用户单击 ListControl(列表)中的项目时,索引或名称将发送到父表单 Form1 上的 lblNowPlaying.Text。
VB.NET - 工作
Private Sub ItemClicked(sender As Object, e As EventArgs)
RaiseEvent ItemClick(Me, flpListBox.Controls.IndexOfKey(sender.name))
End Sub
C# - 不工作
private void ItemClicked(object sender, EventArgs e)
{
ItemClick?.Invoke(this, flpListBox.Controls.IndexOfKey(ToString(sender.name)));
}
现在,由于代码转换,它不会在父表单上显示任何数据并产生以下错误。问题是 sender.name 它抱怨“名称”。
这在 VB.NET 中运行完美,我今天无法理解这个错误。
我相信这工作正常,因为没有语法错误(同样,在 VB.NET 中 100% 工作)。这是在 Form1 上:
private void ListControl1_ItemClick(object sender, int Index)
{
// Get the list item name clicked
this.lblNowPlaying.Text = "Download: " + this.ListControl1.GetControl(Index).Song;
}
和VB.NET版本
Private Sub ListControl1_ItemClick(sender As Object, Index As Integer) Handles ListControl1.ItemClick
' Get the list item name clicked
lblNowPlaying.Text = "Download: " & ListControl1.GetControl(Index).Song
End Sub
基本上,这只是将 Form1 文本更改为他们单击的任何内容,在本例中是名称。
我试过了没有效果
this.flpListBox.Controls.IndexOfKey(((Control)sender).Name);
flpListBox.Controls.IndexOfKey(DirectCast(sender, Control).Name)
直播等等。我想不通。
请提供帮助!
您的 VB.NET 代码工作的原因是由于称为 后期绑定 的语言功能 - 有效地允许隐式转换(相当昂贵的 at-运行-Object
到 ListControlItem
类型的一次)。此功能仅允许在 VB.NET 代码中使用 Option Strict Off
(默认设置);然而,C#根本没有这个特性。
因此,VB.NET 代码:
Private Sub ItemClicked(sender As Object, e As EventArgs)
RaiseEvent ItemClick(Me, flpListBox.Controls.IndexOfKey(sender.name)) 'expensive run-time cast and Late binding!
End Sub
真的应该是(Option Strict On
):
Private Sub ItemClicked(sender As Object, e As EventArgs)
RaiseEvent ItemClick(Me, flpListBox.Controls.IndexOfKey((DirectCast(sender, ListControlItem).Name)) 'Compile-time checked, efficient cast!
End Sub
在 C# 中:
private void ItemClicked(object sender, EventArgs e)
{
ItemClick?.Invoke(this, flpListBox.Controls.IndexOfKey(ToString((sender as ListControlItem).Name)));
}
此外,两种语言之间的一个非常重要的区别是VB.NET不区分大小写,而C#区分大小写!请注意,在 C# 代码(和 VB.NET Option Strict On
代码中),我将 name
属性 设为大写(看起来它在 VB.NET 你引用的项目) - 但仔细检查你的代码。 IntelliSense 是您的好帮手 - 一旦您拥有正确的类型,您将在键入时看到 Visual Studio 中列出的属性。
有关选项严格和后期绑定的更多信息:https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/option-strict-statement
今天我已经在这上面待了很长时间了。最近我们将 VB.NET 项目完全转换为 C#,它在各个方面都完美运行。
然而,我们遇到的问题是,我们的 ListControlItem 点击侦听器 在转换后是错误的。
我们有一个名为 flpListBox 的 FlowLayoutPanel,项目是在 Form1_Load.
中使用 Add() 方法添加的例如
ListControl1.Add("name", "name2", "name3");
预期结果
当用户单击 ListControl(列表)中的项目时,索引或名称将发送到父表单 Form1 上的 lblNowPlaying.Text。
VB.NET - 工作
Private Sub ItemClicked(sender As Object, e As EventArgs)
RaiseEvent ItemClick(Me, flpListBox.Controls.IndexOfKey(sender.name))
End Sub
C# - 不工作
private void ItemClicked(object sender, EventArgs e)
{
ItemClick?.Invoke(this, flpListBox.Controls.IndexOfKey(ToString(sender.name)));
}
现在,由于代码转换,它不会在父表单上显示任何数据并产生以下错误。问题是 sender.name 它抱怨“名称”。
这在 VB.NET 中运行完美,我今天无法理解这个错误。
我相信这工作正常,因为没有语法错误(同样,在 VB.NET 中 100% 工作)。这是在 Form1 上:
private void ListControl1_ItemClick(object sender, int Index)
{
// Get the list item name clicked
this.lblNowPlaying.Text = "Download: " + this.ListControl1.GetControl(Index).Song;
}
和VB.NET版本
Private Sub ListControl1_ItemClick(sender As Object, Index As Integer) Handles ListControl1.ItemClick
' Get the list item name clicked
lblNowPlaying.Text = "Download: " & ListControl1.GetControl(Index).Song
End Sub
基本上,这只是将 Form1 文本更改为他们单击的任何内容,在本例中是名称。
我试过了没有效果
this.flpListBox.Controls.IndexOfKey(((Control)sender).Name);
flpListBox.Controls.IndexOfKey(DirectCast(sender, Control).Name)
直播等等。我想不通。
请提供帮助!
您的 VB.NET 代码工作的原因是由于称为 后期绑定 的语言功能 - 有效地允许隐式转换(相当昂贵的 at-运行-Object
到 ListControlItem
类型的一次)。此功能仅允许在 VB.NET 代码中使用 Option Strict Off
(默认设置);然而,C#根本没有这个特性。
因此,VB.NET 代码:
Private Sub ItemClicked(sender As Object, e As EventArgs)
RaiseEvent ItemClick(Me, flpListBox.Controls.IndexOfKey(sender.name)) 'expensive run-time cast and Late binding!
End Sub
真的应该是(Option Strict On
):
Private Sub ItemClicked(sender As Object, e As EventArgs)
RaiseEvent ItemClick(Me, flpListBox.Controls.IndexOfKey((DirectCast(sender, ListControlItem).Name)) 'Compile-time checked, efficient cast!
End Sub
在 C# 中:
private void ItemClicked(object sender, EventArgs e)
{
ItemClick?.Invoke(this, flpListBox.Controls.IndexOfKey(ToString((sender as ListControlItem).Name)));
}
此外,两种语言之间的一个非常重要的区别是VB.NET不区分大小写,而C#区分大小写!请注意,在 C# 代码(和 VB.NET Option Strict On
代码中),我将 name
属性 设为大写(看起来它在 VB.NET 你引用的项目) - 但仔细检查你的代码。 IntelliSense 是您的好帮手 - 一旦您拥有正确的类型,您将在键入时看到 Visual Studio 中列出的属性。
有关选项严格和后期绑定的更多信息:https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/option-strict-statement