从控件转换窗口
本文关键字:窗口 转换 控件 | 更新日期: 2023-09-27 18:04:19
我有一段简单的代码:
private void btnAdd_Click(object sender, EventArgs e)
{
if (AskForSaveBeforeClose(null))
{
LoadForm<Soles>(btnAdd, "Add");
}
}
btnAdd
现在是我唯一具有ToolStripDropDown
类型的按钮。所有其他按钮均为ToolStripButton
类型。如您所见,我将这个按钮作为 e 参数传递给方法,并在许多其他方法中使用ToolStripButton
作为参数类型。我不想过多地破坏我的代码,我认为应该可以投射btnAdd
形式ToolStripDropDownButton
来ToolStripButton
和解决我的问题。可以这样做吗,如果没有,您是否有另一个想法来保留我的代码。我需要下拉功能,但目前任何解决方法都是可以接受的。
这是继承层次结构:
System.Object System.MarshalByRefObject
System.ComponentModel.Component
System.Windows.Forms.Control
System.Windows.Forms.ScrollableControl
System.Windows.Forms.ToolStrip
System.Windows.Forms.MenuStrip
System.Windows.Forms.StatusStrip
System.Windows.Forms.ToolStripDropDown
System.Windows.Forms.ToolStripDropDownMenu
System.Windows.Forms.ContextMenuStrip
不能将ToolStripDropDownButton
强制转换为ToolStripButton
,因为前者不会从后者继承。但是,两者都继承自ToolStripItem
,因此您可以改为转换为该继承。
说你做:
var button = ((btnSoles as ToolStripItem) as ToolStripButton);
但是,这不会做您想要的。首先,btnSoles
始终是一个ToolStripItem
因此您应该改用直接强制转换:
var item = (ToolStripItem)btnSoles;
然后,如果您确实需要由ToolStripButton
而不是ToolStripItem
提供的功能,则只有这样您才应该使用as
:
var button = btnSoles as ToolStripButton;
如果无法将btnSoles
转换为ToolStripButton
,这将返回null
。如果它是一个 ToolStripDropDownButton
,正如你所说,那么它不能被铸造,结果将是null
.请注意,双重转换不是必需的,通常很少需要。
除非ToolStripDropDownButton
从ToolStripButton
.如果没有,则它们可能具有可用作参数类型的共同祖先。