C#:如何在包含控件的表单上获取工具提示?

问题描述 投票:0回答:1

C#:我有一个Validator类,它可以验证项目所有形式的字段。我想(从函数中)引用包含已验证控件的表单上的工具提示。此控件是函数参数。

public static Boolean ValidateText(object sender)
{
     ToolTip ttHelp = (sender as TextBox).FindForm().Controls["myToolTip"] as ToolTip;//Error   CS0039
     if((sender as TextBox).Text=="")
                 ttHelp.SetToolTIp(someControl,someMessage);
    ....
}

错误CS0039无法通过引用转换,装箱转换,装箱转换,换行转换或空类型转换将类型'System.Windows.Forms.Control'转换为'System.Windows.Forms.ToolTip'

c# winforms tooltip
1个回答
0
投票

ToolTip不是控件,而是Component,因此您不会在Form的Controls集合中找到它。相反,它是System.ComponentModel.IContainer components私有字段的一部分,通常在部分类的“窗体的设计器”部分中定义。

要查找控件的工具提示,可以使用ToolTip.GetToolTip([Control])方法,然后验证返回的字符串是否为空。

[如果您可以访问窗体的components字段-即,从包含要验证的控件的窗体中调用ValidateText()方法-您可以将组件容器传递给该方法:

→保留object sender,然后转换为Control,因为在这里您只想访问属于公共Control类的公共属性,例如Text

bool result = ValidateText(this.someControl, this.components);
// [...]

public static bool ValidateText(object sender, IContainer container)
{
    var ctrl = sender as Control;
    var toolTip = container.Components.OfType<ToolTip>()
                 .FirstOrDefault(tt => !string.IsNullOrEmpty(tt.GetToolTip(ctrl)));

    if (toolTip != null) {
        string tooltipText = toolTip.GetToolTip(ctrl);
        // [...]
        if (ctrl.Text == "") { }
        return true;
    }
    return false;
}

否则,如果传递给ValidateText()方法的Control实例的来源不确定,则可以通过反射访问组件集合。

使用[form].GetType().GetField("components").GetValue([form]) as IContainer,我们可以访问components字段值,然后像以前一样继续。

→在这里,sender已经是Control类型的,因为这是sender的实数nature

ValidateText([Control])重载以前的方法。

bool result = ValidateText(someControl); 
// [...]


using System.Reflection;

public static bool ValidateText(Control sender)
{
    var flags = BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetField;
    Form form = sender.FindForm();
    var container = form.GetType().GetField("components", flags).GetValue(form) as IContainer;

    var toolTip = container.Components.OfType<ToolTip>()
                 .FirstOrDefault(tt => !string.IsNullOrEmpty(tt.GetToolTip(sender)));

    if (toolTip != null) {
        string tooltipText = toolTip.GetToolTip(sender);
        // [...]
        return true;
    }
    return false;
}
© www.soinside.com 2019 - 2024. All rights reserved.