2012-05-05 3 views
0

데이터베이스 테이블에서 값을 가져 오는 FormLoad에서 항목이 생성되는 toolstripmenu dropdownitem에 대한 코드를 작성하려면 어떻게해야합니까?동적으로 생성 된 도구 스트립 메뉴 항목을 처리하는 방법

프로그램을 실행하기 전에 존재하지 않는이 항목에 대해 어떻게 OnClick 메서드를 작성할 수 있습니까?

+1

꽤 명확하지 않습니다. 확실히 dbase 테이블에서 toolstrip 항목을 만들 수는 있지만 많이 달성하지는 못합니다. 실제 고기는 사용자가 항목을 클릭 할 때 실행되는 * 코드 *입니다. 그 코드는 어디에 있습니까? –

+0

정확히 어떤 일을하고 싶습니까? 클릭 한 항목의 이름을 가지고 있으면 충분합니까? (이 경우 클릭 한 이벤트에서 이름을 전달하거나 읽을 수 있음) 또는 항목과 이름이 같은 경우 호출되는 클래스/함수를 만들겠습니까? (이 경우에는 '후기 바인딩'이 필요합니다.) – weberik

답변

0

컨트롤은 다른 모든 개체와 같습니다. 우리는 단순히 사용자 인터페이스를 지정하는 데 wysiwyg 디자이너를 사용하는 데 익숙합니다.

이 같은

그래서 뭔가 :

void AddMenuItems(ToolStripItemCollection itemCollection, DataView view) 
{ 
    foreach (DataRowView rowView in view) 
     itemCollection.Add(MakeMenuItem(rowView.Row)); 
} 

ToolStripItem MakeMenuItem(DataRow row) 
{ 
    var item = new ToolStripMenuItem((string)row["Name"]); 
    item.Tag = row; 
    item.Click += new EventHandler(MenuItem_Click); 
    return item; 
} 

void MenuItem_Click(object sender, EventArgs e) 
{ 
    var row = ((ToolStripItem)sender).Tag as DataRow; 
    MessageBox.Show((string)row["HelpText"]); 
} 

당신은 항목 데이터의 DataRow가 아닌 ​​다른 (어떤 종류의 예를 들어 엔티티를) 사용하려면, 아마 완전히 다른 논리 항목을 만들 수 있지만,이 설명 할 수있다 패턴 : 다른 객체를 만들 듯이 항목을 만듭니다. 양식에 이미 뿌리를 둔 일부 메뉴에 항목을 추가합니다 (동적으로 루트를 만들 수도 있지만 어떤 이점이 있는지 알기는 어렵습니다). 항목을 데이터와 함께 사용하고 클릭 핸들러의 태그에서 데이터를 가져옵니다.

여기서는 Name 및 HelpText라는 두 문자열 유형 열이있는 datarows 테이블을 가져온 것으로 가정합니다. 이 이름은 도구 막대 항목 레이블로 사용되며 항목을 클릭하면 도움말 텍스트가 표시됩니다.

당신은 이름이 같은하고 뭔가 시작되는 행을 나타내는 메뉴를 만들려면이를 사용할 수 있습니다

var view = GetMenuDataSet().Tables[0].DefaultView; 
view.RowFilter = "Name LIKE 'A%'"; 
menu.Items.Clear(); 
AddMenuItems(menu.Items, view); 

이 GetMenuDataSet 이전에 언급 한 두 개의 열이있는 테이블을 포함하는 데이터 집합을 반환 가정, 디자인 타임에 "menu"라는 이름의 루트 메뉴 (예 : ContextMenuStrip)를 폼에 배치했는지 (그렇지 않으면이 코드가 실행될 때 만들어 졌는지 확인)

계층 구조를 만들려면 AddMenuItems를 호출하고 루트 메뉴의 "Items"대신 일부 항목의 DropDownItems 컬렉션을 전달하면됩니다. 둘 다 ToolStripItemCollection 유형입니다.

관련 문제