4

我有这段简单的代码:

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
4

2 回答 2

2

您不能将 a 强制ToolStripDropDownButton转换为 a ToolStripButton,因为前者不会后者继承。但是,两者都继承自,ToolStripItem因此您可以改为使用它。

你说你做:

var button = ((btnSoles as ToolStripItem) as ToolStripButton);

但是,这不会做你想做的事。首先,btnSoles总是 aToolStripItem所以你应该使用直接转换:

var item = (ToolStripItem)btnSoles;

然后,如果您确实需要由ToolStripButton而不是由提供的功能,ToolStripItem那么您应该使用as

var button = btnSoles as ToolStripButton;

null如果btnSoles不能强制转换为 ,这将返回ToolStripButton。如果它是 a ToolStripDropDownButton,如您所说,那么它不能被强制转换,结果将是null。请注意,双重演员不是必需的,通常很少需要。

于 2013-03-15T15:29:14.653 回答
1

ToolStripDropDownButton除非从 下降,否则您将无法施放它ToolStripButton。如果没有,可能它们有共同的祖先,您可以将其用作参数类型。

于 2013-03-15T15:26:58.100 回答