首页 > 解决方案 > 将子控件项值发送到父表单文本框

问题描述

我今天在这方面已经有一段时间了。最近,我们将 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)

直接广播它等等。我想不通。

请任何帮助表示赞赏!

编译器错误 CS1061

标签: c#winformssyntaxcontrols

解决方案


您的 VB.NET 代码工作的原因是由于一种称为后期绑定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.NETOption Strict On代码)中,我将name属性设为大写(看起来就像在您引用的 VB.NET 项目中一样) - 但请仔细检查您的代码。IntelliSense 是您的朋友 - 一旦您拥有正确的类型,您将在键入时看到 Visual Studio 中列出的属性。

有关 Option Strict 和后期绑定的更多信息:https ://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/option-strict-statement


推荐阅读