2013-03-28 5 views
7

나는 MDI Windows Forms 응용 프로그램에서 작업 중입니다. 부모님 양식에는 ToolStrip 메뉴와 일부 ToolStripDropDownButtons 메뉴가 있습니다. ToolStripDropDownButtonVisible 속성 또는 해당 사용자의 허가에 따라 ToolStripItems (하위 버튼) 중 일부 속성을 변경하고 싶습니다.Windows Forms - ToolStripItem Visible 속성은 항상 false로 설정됩니다.

private void SetToolStripDropDownVisibility(ToolStripDropDownButton mainBtn, params ToolStripItem[] item) 
{ 
    mainBtn.Visible = false; 
    foreach (ToolStripItem tempItem in item) 
    { 
     tempItem.Visible = true; 
    } 
} 

내가 첫 번째 인수 ToolStripDropDownButton, params가 목록 다른 모든 "서브 버튼"으로 전달 해요 : 여기

내가이를 관리하는 데 쓴 한 방법의 일부입니다. 그러나 foreach (ToolStripItem tempItem in item) 부분에서 디버그 모드로 들어가면 tempItem Visible 속성은 false로 표시됩니다. 그러나 디자이너에서는이 속성이 true로 설정됩니다. 값을 실제로 true로 변경하려고 시도하는 것을 볼 수 있습니다 - tempItem.Visible = true;하지만이 행이 아무 것도하지 않는 것 같습니다. Visible의 값은 false이며 변경할 수 없습니다.

이것은 단지 메소드의 시작일 뿐이므로 ToolStrip 항목으로 엉망이 될 수있는 다른 코드는 생각할 수 없습니다. 나는 mainBtn.Visible의 값을 true 또는 false로 변경하려고 시도했는데 어쩌면 연결이있는 것 같지만 이것이 문제가 아닌 것으로 보입니다. 그래서 왜 이런 일이 일어나고 있는지, 왜 Visible의 가치를 바꿀 수 없는지, 그리고 어떤 식 으로든 그것을 할 수있는 방법은 무엇입니까?

  List<ToolStripMenuItem> allItems = new List<ToolStripMenuItem>(); 
      foreach (ToolStripMenuItem toolItem in menuStrip1.Items) 
      { 
       allItems.Add(toolItem); 
       //add sub items 
       allItems.AddRange(GetItems(toolItem)); 
      } 
      foreach (ToolStripMenuItem item in allItems) 
      { 
       //make your toolstripMenuItem invisible or whatever you want to do with it. 
      } 
      allItems.Clear(); 

변경 menuStrip1 당신이 당신의 toolstrip 전화 뭐든 :

+0

"item"을 "items"로 변경해도 피해가 없으며 가독성이 향상됩니다. – David

답변

17

이 솔루션은 쉽지만 아직 명확하지 않습니다. ToolSTripDropDownButton의 일부인 ToolStripItems과 작업해야하고 일반 버튼으로 해결하기 위해 사용했던 가시성 문제를 해결하려면 Available 속성을 사용해야합니다. 이 목적을 위해 정확하게 설계되었습니다. 누군가가 이것을 읽음으로써이 문제를 다루는 시간을 줄이기를 희망합니다!

+5

그건 어떻게 작동하지 않습니다. 사용 가능 및 보이기는 * 거의 동일한 특성이며 다른 하나는 다른 특성을 변경합니다. 그러나 한 가지 차이점이 있으면 Visible 속성은 사용자가 항목을 볼 수있을 때만 true를 반환합니다. 양식 생성자 또는 Load 이벤트 내에서 절대 해당하지 않는 양식은 아직 표시되지 않습니다. 너무 높은 확률로 인해 문제가 없다는 것을 알았습니다. 디버거가 말한 것에 혼란 스러울 것입니다. –

+0

문제는 런타임에 표시되는 내용과 그의 사용 권한으로 인해 특정 사용자에게 표시되지 않는 내용을 결정하는 방법이었습니다. 'ToolStripItem'을 사용할 수있는 경우, 사용자가 사용할 수있는'ToolStripItem'이 없다면'DropDownButton'이 보이고,'DropDownButton'도 숨겨져 있어야합니다. 'Visible' 속성을 사용하면 도움이되지 않습니다. 왜냐하면 당신이 말했듯이 항상 false를 반환 할 것이고'DropDownButton'은 항상 숨겨 질 것이기 때문입니다. 하지만 'Available'속성을 설정하면 모든 것이 정상입니다. – Leron

+1

감사합니다 귀하의 솔루션은 내 문제를 해결 – Henry

1

다음은 모든 toolstripitemsmenuStrip1 내에서 여물 이동합니다.

+0

문제는 내가'ToolStrip' 항목의 목록을 만들 수 없다는 것입니다. 문제는 'Visible'이 false로 설정되어 있고 사실로 변경하는 방법을 찾을 수 없다는 것입니다. item.Visible = true'는 항목을 보이지 않게하고 디버그 모드에서이 행 뒤에 보이는 값은 true로 설정했지만 여전히 false입니다. – Leron

+0

그 이상한, 코드가 나를 위해 일하고 ... – Max