2011-01-14 2 views
2

내 Windows 응용 프로그램에서 문맥이있는 상황에 맞는 메뉴가 있는데 문제는 사용자 previlages.How에 따라 컨텍스트 메뉴에서 ToolStripMenuItem을 사용하지 않도록 설정하는 것입니다. 어떻게 할 수 있습니까? 나는이 같은 짓을하지만 상황에 맞는 메뉴에서 ToolStripMenuItem을 비활성화하는 방법 동적으로?

private void contextMenuStrip_Machine_Opening(object sender, CancelEventArgs e) 
{ 
    toolStripAuthorize.Enabled = INFOpermission.accessAuthorize; 
} 

작동하지 않습니다하지만 당신은 true 또는 false 중 하나에 toolStripAuthorize.Enabled을 설정해야

+1

1. 더 많은 코드를 보여주십시오. 2. 할당 후에 toolStripAuthorize에 중단 점을 설정하면 Enabled가 false 또는 true로 설정됩니까? 3. INFOpermission.accessAuthorize가 예상대로 false로 설정 되었습니까? – dzendras

답변

6

을 작동하지 않습니다.

는 당신이 정의하는 코드를 그 (ENUM?) 보여주지 않았기 때문에 무엇 INFOpermission.accessAuthorize 아무 생각이 없다, 그러나 false 이외의 경우, 이것은 당신이 기대처럼 작동하지 않을.

나는 당신이 Opening event 핸들러 false를 비활성화 할 ToolStripMenuItemEnabled property을 설정하면을 작동 할 것이라고 보장 할 수 있습니다. 그것이 당신을 위해 일하지 않는다면, 당신은 뭔가 다른 잘못을하고 있고, 우리는 계속하기 위해 더 많은 정보를 우리에게 줄 필요가 있습니다. How to: Handle the ContextMenuStrip Opening Event


편집 : 코멘트에 제공되는 새로운 정보와 무장, 지금 문제의 원인을 격리 한 문제가 발생할 경우

, 여기에 샘플 코드를 참조하십시오. ContextMenuStripDataGridView 컨트롤 인 RowTemplate에 할당 했으므로 Opening 이벤트 처리기 메서드에서 해당 컨텍스트 메뉴에 포함 된 항목을 수정할 수 없습니다.

이것은 누군가가 "의도적으로"결정한 알려진 버그입니다. 원래 버그 보고서 here on Microsoft Connect을 볼 수 있습니다. 주어진 설명은 RowTemplate (즉, RowTemplate의 작동 방식)을 기반으로 새 행을 만들 때마다 할당 한 ContextMenuStrip도 복제됩니다. 즉, 동일한 컨텍스트 메뉴 인스턴스가 각 행에 사용되지 않으며 원래 메뉴 항목에서 설정하려고 시도한 속성은 아무런 효과가 없습니다.

다행히도 우리에게 해결 방법을 제공합니다. 모든 이벤트와 마찬가지로 Opening 이벤트는 sender 매개 변수로 열리고 자하는 ContextMenuStrip의 실제 인스턴스를 전달합니다. 은 변경 사항을 표시 할 수 있도록 항목을 수정해야하는 컨텍스트 메뉴입니다.

코드가 무엇입니까?은 다음과 같습니다

private void contextMenuStrip_Opening(object sender, CancelEventArgs e) 
{ 
    ContextMenuStrip cmnu = (ContextMenuStrip)sender; 
    cmnu.Items[1].Enabled = false; 
} 

공지 사항,하지만 당신은 당신이 인덱스에 의해 수정할 개별 메뉴 항목을 참조 할 필요는거야. 이 값은 메뉴에서 수정하려는 항목의 제로 기준 위치에 불과합니다. 새 인스턴스가 각각의 새 컨텍스트 메뉴 인스턴스에 대해 복제되었으므로 전에 시도한 것처럼 toolStripAuthorize 객체를 사용할 수 없습니다.

+0

false를 반환하고 value도 assining하지만 toolstripmenu가 표시됩니다 – Nighil

+0

@NIGHIL : * menu *가 계속 열립니다. 메뉴 열기를 취소하려면'e.Cancel = true'를 설정하십시오. 특정 항목의 'Enabled' 속성을 설정하면 메뉴에서 회색으로 표시됩니다 (선택 취소 할 수 없음). 당신은 무엇을하려고합니까? –

+0

@ 코드 그레이 : 메뉴가 열리지 만 비활성화 된 항목은 메뉴에서 사용 가능합니다. INFOpermission.accessAuthorize 값은 false입니다. – Nighil

관련 문제