2011-04-14 5 views
3

두 개의 컨트롤 (DataGridView)에 하나의 ContextMenuStrip이 연결되어 있습니다. ToolStripMenuItem 클릭 이벤트에서
, 나는이 코드를 원래 호출합니다 (DataGridView)를 얻을 관리 : 그것은 꽤 잘 작동바로 가기 키를 사용할 때 내 ContextMenuStrip의 SourceControl을 가져옵니다.

var menu = (ToolStripDropDownItem)sender; 
var strip = (ContextMenuStrip)menu.Owner; 
var dgv = (DataGridView)strip.SourceControl; 

ToolStripMenuItem 클릭 할 때.
그러나 ToolStripMenuItem에 링크 된 sortcut 키를 사용하면 스트립이 생깁니다. SourceControl return null.
이유를 아는 사람이 있습니까?

+0

: 한 가지 방법은 DataGridView를가 ToolStripMenuItem 클릭의 의도 된 수신기에 포커스가 어느 참조하는 것이었다 파악하기 이벤트가 발생한 DataGridview 이벤트를 모르는 단축키를 사용하여 각 DataGrid 또는 다른 메뉴에 다른 바로 가기를 설정해보십시오 – AlaaL

+0

바로 가기는 ToolStripMenuItem의 속성입니다. 하나의 ToolStripMenuItem 만 있으므로 다른 바로 가기를 설정할 수 없습니다. 해결책은 두 개의 메뉴를 만들 수 있지만이 동작이 왜 발생하는지 알고 싶습니다. – Nicolas

답변

4

SourceControl 속성은 ContextMenuStrip이 열리는 원인이되는 컨트롤을 표시합니다. 이 경우에는 ContextMenuStrip이 표시되지 않으므로 ContextMenuStrip을 열 때 사용 된 컨트롤이 없으므로 속성이 null입니다.

이 속성은 오프닝 이벤트의 컨텍스트에서 사용하는 것이 좋습니다. ContextMenuStrip.SourceControl을 참조하십시오.

업데이트 : 어쩌면 당신은 그래서 때를 견인 DataGridView에 하나의 메뉴 을 가지고 있기 때문에

var dgv = this.ActiveControl as DataGridView; 
if (dgv != null) // make sure to check for null before trying to use this var 
    //... 
+0

SourceControl 속성에 대한 귀하의 정확성을 가져 주셔서 감사합니다. 하지만 바로 가기 키를 사용할 때 ContextMenuStrip을 소유 한 컨트롤을 얻으려면 어떻게해야합니까? – Nicolas

+0

포커스가있는 DataGridView를 확인하는 방법을 추가했습니다. 포커스가 DataGridView 중 하나에 없으면 사용자가 어느 멤버를 대상으로했는지 알 수있는 방법이 없을 수 있습니다. – msergeant

+1

ActiveControl 속성은 좋은 생각입니다. 불행히도 내 DataGridViews는 SplitContainer에 있고 ActiveControl 속성은 나에게 SplitContainer를 반환합니다. – Nicolas