【发布时间】:2021-11-29 08:40:36
【问题描述】:
我今天在这里已经有一段时间了。最近我们将我们的 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)
直接投射等等。我想不通。
请给予任何帮助!
【问题讨论】:
-
“它抱怨
sender.name” - 究竟是什么错误?演员阵容是绝对必要的,顺便说一句,因为sender是一个对象,当然没有.name。请添加实际的编译器错误或异常。 -
谢谢,它正在引发“编译器错误 CS1061”-“类型”不包含“名称”的定义,并且没有可访问的扩展方法“名称”接受“类型”类型的第一个参数找到。
-
好的,这很有意义 - 实际使用的控件是什么(ListControl 是 ComboBox 和 ListBox 的基础),存储的项目是什么数据类型?您还可以注释掉有问题的行,改为设置断点(在该事件处理程序的空行上放置一个分号,并为其设置断点),然后在即时窗口中查看
sender.GetType().Name -
顺便说一句,这个应用程序的 VB.NET 版本很可能是在没有
Option Strict On的情况下构建的,或者明确地使用Option Strict Off- 这是正确的吗? -
我 100% 使用这个 - codeproject.com/Articles/333864/Flexible-List-Control - 这是一个成功的转换,但是这个问题!我不熟悉断点,完全从 VB.NET 切换,所以很震惊
标签: c# winforms syntax controls