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'
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;
}