从控件转换窗口

本文关键字:窗口 转换 控件 | 更新日期: 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形式ToolStripDropDownButtonToolStripButton和解决我的问题。可以这样做吗,如果没有,您是否有另一个想法来保留我的代码。我需要下拉功能,但目前任何解决方法都是可以接受的。

这是继承层次结构:

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.请注意,双重转换不是必需的,通常很少需要。

除非ToolStripDropDownButtonToolStripButton .如果没有,则它们可能具有可用作参数类型的共同祖先。