【问题标题】:Sending Child Control Item Value to Parent Form Textbox将子控件项值发送到父表单文本框
【发布时间】: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


【解决方案1】:

您的 VB.NET 代码工作的原因是由于一种称为 后期绑定 的语言功能 - 有效地允许将 Object 隐式转换(在运行时进行相当昂贵的转换)到ListControlItem 类型。此功能仅在带有Option Strict Off 的VB.NET 代码中允许(默认设置);但是,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 中列出的属性。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 2017-05-27
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 2020-12-19
    相关资源
    最近更新 更多