c# - 将子控件项值发送到父表单文本框
问题描述
我今天在这方面已经有一段时间了。最近,我们将 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 代码工作的原因是由于一种称为后期绑定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
推荐阅读
- java - 使用 Spring、JPA 和 Hibernate 的通用 DAO 设置
- excel - Excel VBA用户表单:当我更改数据输入的第一列时数据覆盖
- reactjs - 使用 reactjs 将模式框推送到当前页面
- django - 如何呈现 POST 并使其显示在另一个页面上?以 Django 形式
- bash - bash printf 格式化 - 避免长行换行
- android - 匕首代码有效,如何使牙签代码以相同的方式工作?
- java - 如何使用java排除mongodb中的嵌套字段
- c++ - 使用在 C++ dll 中声明的函数及其 VB 声明
- python-3.x - Python:遍历目录树并检查最后一个子目录是否有文件
- mapbox - Mapbox GL JS - 堆叠/分层图像叠加