2013-03-15 3 views
4

Je possède ce simple morceau de code:coulée fenêtres de contrôle

private void btnAdd_Click(object sender, EventArgs e) 
{ 
    if (AskForSaveBeforeClose(null)) 
    { 
     LoadForm<Soles>(btnAdd, "Add"); 
    } 
} 

btnAdd car maintenant mon seul bouton avec le type ToolStripDropDown. Tous les autres boutons sont du type ToolStripButton. Comme vous le voyez, je passe ce bouton en tant que paramètre e à une méthode, et j'utilise ToolStripButton comme type de paramètre dans beaucoup d'autres méthodes. Je ne veux pas trop casser mon code, et je pense qu'il devrait être possible de lancer btnAdd formulaire ToolStripDropDownButton à ToolStripButton et résoudre mon problème. Cela peut-il être fait et si ce n'est pas le cas, avez-vous une autre idée pour conserver mon code? J'ai besoin de la fonctionnalité déroulante, mais toute solution de rechange est acceptable pour le moment.

cette hiérarchie est l'héritage:

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 
+0

Que faites-vous avec les boutons dans les méthodes que vous les transmettez? Si vous activez/désactivez alors vous pouvez simplement traiter les boutons comme un type de contrôle ... –

+0

Tâches de base - changer 'ForeColor' et ce genre de choses – Leron

+0

Vérifiez les propriétés du type de contrôle: http://msdn.microsoft.com /en-us/library/system.windows.forms.control.aspx Il peut contenir tout ce dont vous avez besoin. –

Répondre

2

Vous ne pouvez pas transformer un ToolStripDropDownButton en un ToolStripButton comme le premier et non hériter de ce dernier. Cependant, tous les deux héritent de ToolStripItem afin que vous puissiez convertir à cela à la place.

Votre que vous faites:

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

Cependant, cela est pas va faire ce que vous voulez. Tout d'abord, btnSoles est toujours un ToolStripItem vous devez donc utiliser une distribution directe à la place:

var item = (ToolStripItem)btnSoles; 

Ensuite, si vous vraiment besoin d'une fonctionnalité qui est fournie par ToolStripButton et non par ToolStripItem, alors seulement si vous utilisez as:

var button = btnSoles as ToolStripButton; 

Cela renverra null si btnSoles ne peut pas être jeté à ToolStripButton. S'il s'agit d'un ToolStripDropDownButton, comme vous le dites, il ne peut pas être lancé et le résultat sera null. Notez que la double distribution n'est pas nécessaire et rarement nécessaire en général.

+0

((btnAdd comme ToolStripItem) comme ToolStripButton) - cela fonctionne ... au moins, il semble que ce soit le cas:) Merci – Leron

+0

Si btnAdd n'est pas ToolStripButton, alors vous êtes trompé par ces regards Notez que C# 'as' cast retourne' null' si le cast ne peut pas être fait. – Igor

1

Vous ne serez pas en mesure de le jeter à moins ToolStripDropDownButton descend de ToolStripButton. Si ce n'est pas le cas, ils peuvent avoir un ancêtre commun que vous pouvez utiliser comme type de paramètre.

+0

cette hiérarchie est l'héritage: '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' – Leron

+0

Oh man, maintenant je vois 'ToolStripButton' n'est pas là :(Tout ce temps je pensais que c'est :( – Leron