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

前者は後者から継承しないToolStripDropDownButtonため、 aを a にキャストすることはできません。ただし、どちらも継承元であるため、代わりにキャストできます。ToolStripButtonToolStripItem

あなたは言う:

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

ただし、これはあなたが望むことをするつもりはありません。まず、btnSolesは常に a であるToolStripItemため、代わりに直接キャストを使用する必要があります。

var item = (ToolStripItem)btnSoles;

次に、 ではなく によって提供される機能が本当に必要な場合にのみ、 を使用する必要があります。ToolStripButtonToolStripItemas

var button = btnSoles as ToolStripButton;

にキャストできないnull場合、これが返さbtnSolesToolStripButtonれます。あなたが言うようにの場合ToolStripDropDownButton、キャストすることはできず、結果は になりますnull。二重キャストは必要なく、一般的にほとんど必要ないことに注意してください。

于 2013-03-15T15:29:14.653 に答える
1

ToolStripDropDownButtonの子孫でないとキャストできませんToolStripButton。そうでない場合は、パラメーターの型として使用できる共通の祖先を持っている可能性があります。

于 2013-03-15T15:26:58.100 に答える