Menu strip   zodpovězená otázka

VB.NET, WinForms

Dobrý den, narazil jsem na jednu podivnost při použití Menu strip a tak bych chtěl vědět zda se s tím někdo nesetkal a zda má jednoduché řešení. V menu strip mám toolStripItem (dejme tomu s názvem číselník). Po kliknutí se zobrazí 2 položky (číst,upravit).Tyto položky mají onu známou "šipečku" (velmi oblíbená například u starších verzí MS office). Po najetí na položku se zobrazí vpravo vedle rozbaleného menu další menu tlačítka. Potud vše v pořádku. Některým uživatelům potřebuji zakázat změny číselníku. To jsem chtěl udělat tak, že onu položku "se šipečkou" (jmenuje se upravit) zakážu pomocí frmaplikace.UpravitToolStripMenuItem.Enabled = False . Naivně jsem si myslel že se tím znepřístupní položky které jsou v ní vnořené. Ale ouha, tato položka sice zašedne jako že je nedostupná, ale když na ní kliknu, položky které jsou v ní vnořené se objeví a normálně fungují. Nesetkal jste se s tím někdo prosím?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Zdravím, na mém VS2008EE vše funguje jak má. Po znepřístupnění Itemu 'čísleník' se ani nerozbalí podnabídka.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Já používám VS 2005 Profesionál. Nevím zda dělám něco špatně nebo zda se jedná o bug. Pokud na zašedlý item najedu nerozbalí se, ale po pár kliknutích ano. A to mi nepříjde jako standartní chování.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To stoprocentně není standardní chování. Když se Item znepřístupní, logicky musí být nepřístupné i Items pod ním. Což u mne jsou. Nevím, kde může být chyba, snad jedině, používáte MenuStrip z .NET FW a ne nějaký stažený? Jinak mě nenapadá čím by to bylo.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak ještě jeden poznatek. S tím klikáním to je omyl. I když na něj klikám sebevíc tak se nerozbalí. Pokud ale najedu na položku nad ním (která je odemčená) a pak myší najedu na tento zamčený item tak se ukážou i jeho podpoložky.

Používám MenuStrip který je standartně ve Visual Studiu. Není to žádný přidaný objekt.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Skutečně, máte pravdu. No zřejmě jste odhalil bug jedné z komponent VS. Musíte tedy nejspíš rekurzivně zakázat i všechny podpoložky, jinak si řešení nedovedu představit.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Děkuji, teď alespoň vím že chyba není mezi klávesnicí a židlí:) Ještě zkusím přes naše IT zjistit zda není k dispozici nějáká záplata od Microsoftu, která by tento problém vyřešila.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Pak dejte vědět, tohle je zajímavý problém :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

K žádným takovým problémům u mne nedochází. Microsoft Visual Studio 2005 Standard Service Pack 1. Zkuste stáhnout a nainstalovat ten Service Pack 1 pro Visual Studio.

http://msdn.microsoft.com/en-us/vstudio/...

Rovněž doporučuji nainstalovat všechny aktualizace .NET Frameworku dostupné z Microsoft Update.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ano už jsem si dal na IT požadavek aby mi zpřístupnili microsoft update abych se podíval po záplatách (u nás je zajímavá IT politika. Sice jsem admin na jednom ze serverů, vyvíjím aplikace ale na svém PC mám omezené uživatelské oprávnění a na microsoft update se také nedostanu) :)

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak jsem nainstaloval Service Pack (cca 500MB). Žádné další záplaty jsem už nenašel a můj problém to stejně nevyřešilo. Teď bohužel nemám dostatek času abych se zastavil kvůli takovéto věci, takže jsem to vyřešil jinak. Ale určitě se k tomu ještě vrátím.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak jsem trochu hledal na webu a zjistil, že toto je známý a ohlášený bug, řešení je celkem jednoduché, v jedné události stačí akci zrušit, pokud je rodičovský prvek zašedlý. Neměl by být problém podědit si MenuStripItem tak, aby tohle chování měla v sobě.

Public Class Form1
Sub New()
  ' This call is required by the Windows Form Designer.
  InitializeComponent()

  ' Add any initialization after the InitializeComponent() call.
  AddHandler ItemDisabledToolStripMenuItem.DropDown.Opening, AddressOf DropDownOpening
End Sub

Private Sub DropDownOpening(ByVal sender As Object, ByVal e As
System.ComponentModel.CancelEventArgs)
  Dim tsdd As ToolStripDropDown = CType(sender, ToolStripDropDown)
  If (Not (tsdd Is Nothing) And Not (tsdd.OwnerItem Is Nothing)) Then
    e.Cancel = Not tsdd.OwnerItem.Enabled
  End If
End Sub

End Class

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback