1

我正在尝试通过使用Option Strict On. 我设法清除了除此之外的所有错误。
我正在使用 ToolStrip 的 Tag 属性来获取一些文本信息。单击 ToolStrip,我需要记住字符串中 Tag 的值并更改该 Tag 的值。

如何将Object {String} sender.tag 转换为String以及String myString 和Object {String}

Private Sub ToolStrip_ItemClicked(sender As Object, e As ToolStripItemClickedEventArgs) Handles ToolStrip.ItemClicked
    Dim myString As String = sender.tag
    sender.tag = "It is selected"
    'more code...
End Sub

编辑:请参见此处代码相关部分的屏幕截图:

在此处输入图像描述

4

2 回答 2

6

如果要读取ToolstripItem的 Tag 属性,则需要读取所选项目的 Tag。这是由ToolStripItemClickedEventArgs对象的e.ClickedItem属性提供的:

获取在 ToolStrip 上单击的项目。

如果要读取此 Item 所属的 ToolStrip 的 Tag 属性,请将其转换sender为 ToolStrip(或 Control,此属性所属的基类)并将其 Tag 属性转换为 String。

注意:当您双击 ToolStrip 控件时,将ItemClicked创建一个处理程序,因为这是该控件的默认事件。该事件与 ToolStrip 对象相关,因此sender事件处理程序中的对象将是引发该事件的 ToolStrip 实例的引用。

Tag 属性属于 Type ,这Object就是为什么您也需要强制转换它的原因。

Private Sub ToolStrip_ItemClicked(sender As Object, e As ToolStripItemClickedEventArgs) Handles ToolStrip.ItemClicked
    Dim itemTagAsString As String = e.ClickedItem.Tag?.ToString()

    Dim toolStripTagAsString = DirectCast(sender, ToolStrip).Tag?.ToString()
    ' Or, cast to Control, the Tag Property belongs to the base class
    Dim toolStripTagAsString = DirectCast(sender, Control).Tag?.ToString()
End Sub

检查itemTtag这些示例中的类型(带有Option Infer On):

Dim itemTtag = e.ClickedItem.Tag
Dim itemTtag = e.ClickedItem.Tag?.ToString()

所以更清楚为什么这不是一个有效的陈述:

Dim itemTtag As String = e.ClickedItem.Tag

注意:此处使用空条件运算符( ?,又名 Elvis),因为标签可能为空 ( Nothing)。如果是,你不会得到异常,只是一个空字符串。

于 2021-03-22T14:26:08.897 回答
2

很好,你已经为你的问题命名。你需要一个通用的答案。

Option Strict On是一件好事。它使编码变得更加困难,但运行时的性能会提高,因为隐式数据类型转换会减少。

让我们来看看你的代码...sender As Object......sender.tag.. 这是 .net 中的典型内容。您经常会看到 type 的参数object,这意味着可以传递任何数据类型。对象没有定义属于该数据类型的所有属性和方法。

例如

Dim oTxt as object = new TextBox()

oTxt不会自动拥有财产Text。你需要cast。当您知道 100% 对象类型时,请执行

dim str as string = DirectCast(oTxt, TextBox).Text

但有时你不知道Type你的object. 在这种情况下,您尝试投射,然后检查null

dim txtBx as TextBox = TryCast(oTxt, TextBox)
if txtBx IsNot Nothing Then str = txtBx.Text

您真正的问题是您需要了解类型转换。即使你没有,你也应该显式地转换它,Options Strinct On因为当你x = sender.tag隐式地做时,你真的使用了后期绑定,这对性能不利。这也为潜在的运行时错误打开了大门。

你的研究主题应该是:类型转换、后期绑定、装箱/拆箱

于 2021-03-22T15:32:38.480 回答