将子控件项值发送到父窗体文本框

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-运行-ObjectListControlItem 类型的一次)。此功能仅允许在 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